Semaphore是常见的同步工具类之一。

Semaphore翻译成字面意思为 信号量,Semaphore可以控制同时访问的线程个数,也称为permit(许可)。

在构造函数中指定permits个数。

    /**
* Creates a {@code Semaphore} with the given number of
* permits and nonfair fairness setting.
*
* @param permits the initial number of permits available.
* This value may be negative, in which case releases
* must occur before any acquires will be granted.
*/
public Semaphore(int permits) {
sync = new NonfairSync(permits);
}

可以通过 acquire()方法 获取一个许可,Semephore可用的许可数量减一,如果没有可用的许可就阻塞。

使用acquire()方法需要捕捉InterruptedException异常。

而 release() 方法则会释放一个许可,将它返还给Semaphore,Semephore可用的许可数量加一。

即使没有调用过acquire()方法,也可以直接使用release()。

Semephore中的内部类NofairSync和FairSync继承了AQS (AbstractQueuedSynchronizer)。

Semephore的应用, 示例如下:

假设8个工人,轮流利用5台机器进行工作。那么信号量Semephore的许可permit初始化为5,每当有一个工人占用某一机器时,也就是acquire()时,permits减一。

当所有机器都在使用时,剩下的工人需要等待。

public class SemaphoreDemo {
private static Semaphore semaphore=new Semaphore(5);
public static void main(String[] args) {
for(int i=0;i<8;i++) {
new Thread (new Worker(i)) .start();
} } static class Worker implements Runnable {
private int number;
public Worker(int number) {
this.number=number;
} @Override
public void run() {
try {
semaphore.acquire();
System.out.println("工人"+number+"正在使用某一台机器");
Thread.sleep(5*1000);
semaphore.release();
System.out.println("---------------->工人"+number+"停止使用某一台机器");
}catch (InterruptedException e) {
e.printStackTrace();
}
}
} }

运行结果如下:

工人0正在使用某一台机器
工人1正在使用某一台机器
工人2正在使用某一台机器
工人4正在使用某一台机器
工人5正在使用某一台机器
---------------->工人4停止使用某一台机器
工人7正在使用某一台机器
---------------->工人2停止使用某一台机器
工人3正在使用某一台机器
工人6正在使用某一台机器
---------------->工人0停止使用某一台机器
---------------->工人1停止使用某一台机器
---------------->工人5停止使用某一台机器
---------------->工人7停止使用某一台机器
---------------->工人6停止使用某一台机器
---------------->工人3停止使用某一台机器

最新文章

  1. CentOS 7.2 安装配置 Percona Server
  2. 使用fiddler2抓取手机发出的请求信息
  3. C语言阶乘和求闰年
  4. 趣味C程序100.9 绘制杨辉三角
  5. 在PHP中使用CURL,“撩”服务器只需几行——php curl详细解析和常见大坑
  6. Android Studio使用技巧系列教程(二)
  7. TortoiseSVN使用简介
  8. Giraph入门
  9. python超简单的web服务器
  10. RESTful学习记录
  11. css学习の第二弹—文字格式化排版
  12. JAVA进阶19
  13. Android和H5进行数据交互,Android获取H5Input框中的内容
  14. Java_myBatis_XML代理_动态SQL
  15. HTML5——Data Url生成
  16. python-docx
  17. CocosCreator核心概念里的基础点
  18. KiCad 开源元件库收集
  19. Flume 拦截器(interceptor)详解
  20. PLSQL(PL/SQL)集成Team Foundation Server (TFS),实现数据库代码的版本管理

热门文章

  1. 用三个线程按顺序循环打印ABC三个字母
  2. 【用jersey构建REST服务】系列文章
  3. git clone的时候filename too long解决办法
  4. Oracle创建数据库链接
  5. Hive基础之Hive体系架构&amp;运行模式&amp;Hive与关系型数据的区别
  6. Spark分析之Job Scheduling Process
  7. linux 常规操作EOF写法梳理
  8. a标签解析url
  9. centos7.3给squid搭建代理服务器添加认证apache
  10. jpa 一对多and 多对一