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