Semaphore叫做信号量

可以控制某个资源可被同时访问的个数,

acquire() 获取一个许可,得到许可才能执行后面的代码,如果没有就等待。

release() 释放一个许可。

当信号量的只允许一个线程访问时,就变成了锁的功能。

如下所示 :Semaphore semaphore = new Semaphore(1); 

下面代码演示

public class SemaphoreTest {
public static void main(String[] args) { ExecutorService exec = Executors.newCachedThreadPool();
//创建一个信号量 只允许一个线程访问
Semaphore semaphore = new Semaphore(1);
for (int i = 0; i < 10; i++) {
final int NO = i;
Runnable run = new Runnable() {
@Override
public void run() {
try {
semaphore.acquire();
System.out.println("thread "+NO +" "+(System.currentTimeMillis()/1000));
Thread.sleep((long) 1000);
} catch (Exception e) {
e.printStackTrace();
} finally {
semaphore.release();
} }
};
exec.execute(run);
}
// 退出线程池
exec.shutdown();
}
}

  执行结果如下

每一秒钟只能允许一个线程执行。

java多线程系列7 高级同步工具(1)信号量Semaphore的更多相关文章

  1. java多线程系列9 高级同步工具(3) CyclicBarrier

    CyclicBarrier 一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)   然后一再执行 public class CyclicBar ...

  2. java多线程系列8 高级同步工具(2)CountDownLatch

    CountDownLatch,计数器的初始值为线程的数量.每当一个线程完成了自己的任务后, 计数器的值就会减1.当计数器值到达0时,它表示所有的线程已经完成了任务, 然后在闭锁上等待的线程就可以恢复执 ...

  3. java多线程系列3-线程同步

    如果一个资源被多个线程同时访问,可能会遭到破坏,这篇文章介绍java线程同步来解决这类问题 引入问题 某电影院目前正在上映贺岁大片,共有100张票,而它有3个售票窗口售票,请设计一个程序模拟该电影院售 ...

  4. JAVA多线程提高九:Semaphere同步工具

    java 中Semaphere可类比操作系统信号量,硬件资源如IO.内存.磁盘等都是有固定量的,多个程序需要竞争这些资源,没有资源就需要被挂起. 一.类和方法摘要 构造函数: public Semap ...

  5. JAVA多线程提高十四:同步工具Exchanger

    Exchanger可以在对中对元素进行配对和交换的线程的同步点.每个线程将条目上的某个方法呈现给 exchange 方法,与伙伴线程进行匹配,并且在返回时接收其伙伴的对象.Exchanger 可能被视 ...

  6. java多线程系列 目录

    Java多线程系列1 线程创建以及状态切换    Java多线程系列2 线程常见方法介绍    Java多线程系列3 synchronized 关键词    Java多线程系列4 线程交互(wait和 ...

  7. java多线程系列8-线程的优先级

    在java中设置线程优先级使用setPriority,在jdk中的源代码如下: public final void setPriority(int newPriority) { ThreadGroup ...

  8. Java 并发包中的高级同步工具

    Java 并发包中的高级同步工具 Java 中的并发包指的是 java.util.concurrent(简称 JUC)包和其子包下的类和接口,它为 Java 的并发提供了各种功能支持,比如: 提供了线 ...

  9. Java多线程系列--“JUC锁”06之 Condition条件

    概要 前面对JUC包中的锁的原理进行了介绍,本章会JUC中对与锁经常配合使用的Condition进行介绍,内容包括:Condition介绍Condition函数列表Condition示例转载请注明出处 ...

随机推荐

  1. vim中行末去掉^M

    方式1: 输入 :%s/^M//g 方式2: 输入:%s/\r//g

  2. MFC/VC CxImage 编译问题 (VS2013)

    最近在搞CxImage,幸好看到一些前辈的积累,避免了很多坑,CxImage默认是VC6.0编译的,因为我用的VS2013,所以从新编译一下,参考前辈博客https://www.cnblogs.com ...

  3. SpringMVC的工作流程、组件说明以及常用注解说明

    1. SpringMVC处理流程 2. SpringMVC架构 2.1 框架结构 2.2 框架流程 1. 用户发送请求至前端控制器DispatcherServlet. 2. DispatcherSer ...

  4. Unable to complete the scan for annotations for web application [/wrs] due to a StackOverflowError. Possible root causes include a too low setting for -Xss and illegal cyclic inheritance dependencies.

    tomcat启动报错:Jul 20, 2018 11:48:37 AM org.apache.catalina.core.ContainerBase addChildInternalSEVERE: C ...

  5. python多线程简单爬虫

    爬虫本质就是将网站或者接口的数据经过筛选后按需求保存 这里实现一个简单爬虫仅供参考 import requests import bs4 import threading import queue i ...

  6. Python面向对象编程(上)

    Python不仅支持面向过程编程,同时也支持面向对象编程.面向工程就是分析解决问题所需的步骤,然后用函数把这些步骤逐一实现,使用的时候再一个个调用函数就可以.面向对象则是把解决的问题按照一定规则划分为 ...

  7. df命令详解

    1.简介: df命令作用是列出文件系统的整体磁盘空间使用情况.可以用来查看磁盘已被使用多少空间和还剩余多少空间. df命令显示系统中包含每个文件名参数的磁盘使用情况,如果没有文件名参数,则显示所有当前 ...

  8. 分库工具mysql

    sharding-sphere  比mycat 更方便 在于mycat属于中间件,更复杂,但也支持更多功能.查询功能更强.

  9. servlet3.1

    Servlet3.1新增的新特性强制更改sessionId 由HttpServletRequest 的changeSessionId()方法实现 非阻塞式IO 非阻塞式IO我们应该知道Servlet底 ...

  10. 微信小程序开发之保留小数(toFixed) 四舍五入 获取整数 string转int

    https://blog.csdn.net/qq_31383345/article/details/52961767