java并发:Semaphore
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停止使用某一台机器
java并发:Semaphore的更多相关文章
- 【Java并发编程实战】-----“J.U.C”:Semaphore
信号量Semaphore是一个控制访问多个共享资源的计数器,它本质上是一个"共享锁". Java并发提供了两种加锁模式:共享锁和独占锁.前面LZ介绍的ReentrantLock就是 ...
- Java并发编程:CountDownLatch、CyclicBarrier和Semaphore
Java并发编程:CountDownLatch.CyclicBarrier和Semaphore 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch ...
- Java 并发专题 : Semaphore 实现 互斥 与 连接池
继续并发方面的知识.今天介绍Semaphore,同样在java.util.concurrent包下. 本来准备通过例子,从自己实现到最后使用并发工具实现,但是貌似效果并不是很好,有点太啰嗦的感觉,所有 ...
- Java并发编程Semaphore
信号量 信号量类Semaphore,用来保护对唯一共享资源的访问.一个简单的打印队列,并发任务进行打印,加入信号量同时之能有一个线程进行打印任务 . import java.util.concurre ...
- Java并发编程的4个同步辅助类(CountDownLatch、CyclicBarrier、Semaphore、Phaser)
我在<JDK1.5引入的concurrent包>中,曾经介绍过CountDownLatch.CyclicBarrier两个类,还给出了CountDownLatch的演示案例.这里再系统总结 ...
- 【java并发核心一】Semaphore 的使用思路
最近在看一本书<Java并发编程 核心方法与框架>,打算一边学习一边把学习的经验记下来,所粘贴的代码都是我运行过的,大家一起学习,欢迎吐槽. 估计也没多少人看我的博客,哈哈,那么我还是会记 ...
- Java并发工具类(三):控制并发线程数的Semaphore
作用 Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源. 简介 Semaphore也是一个线程同步的辅助类,可以维护当前访问自身的线程个数 ...
- Java并发(十五):并发工具类——信号量Semaphore
先做总结: 1.Semaphore是什么? Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源. 把它比作是控制流量的红绿灯,比如XX马路要 ...
- 25.大白话说java并发工具类-CountDownLatch,CyclicBarrier,Semaphore,Exchanger
1. 倒计时器CountDownLatch 在多线程协作完成业务功能时,有时候需要等待其他多个线程完成任务之后,主线程才能继续往下执行业务功能,在这种的业务场景下,通常可以使用Thread类的join ...
- Java并发编程:CountDownLatch、CyclicBarrier和Semaphore (总结)
下面对上面说的三个辅助类进行一个总结: 1)CountDownLatch和CyclicBarrier都能够实现线程之间的等待,只不过它们侧重点不同: CountDownLatch一般用于某个线程A等待 ...
随机推荐
- POJ 2706 Painter
Painter Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3157 Accepted: 1962 Descripti ...
- 去除adb传输中的^M
学习sed过程中,在文本中每行追加内容,发现使用adb会在行末追加一个看不到^M. 场景一:adb保存到文件 adb shell ps|head -n 10 > text.txt,使用sed进行 ...
- 关于attr("checked")的输出
同样的一段代码,在不同的文件输出不同的答案,好神奇. console.log($("#never").attr("checked")); 一个输出checked ...
- MySQL Binlog三种格式介绍及分析
Mysql binlog日志有三种格式,分别为Statement,MiXED,以及ROW! 1.Statement:每一条会修改数据的sql都会记录在binlog中. 优点:不需要记录每一行的变化,减 ...
- 【RL前沿】深度强化学习的最新进展 by 2017.12.12
作者:Volodymyr Mnih Google DeepMind科学家. 在Geoffrey Hinton的指导下完成了多伦多大学的机器学习博士学位. 在此之前,在Csab Szepesvari的指 ...
- 洛谷P1415 拆分数列
题目背景 [为了响应党中央勤节俭.反铺张的精神,题目背景描述故事部分略去^-^] 题目描述 给出一列数字,需要你添加任意多个逗号将其拆成若干个严格递增的数.如果有多组解,则输出使得最后一个数最小的同时 ...
- git 隐藏文件删除
1.首先切换到当前目录 cd /Users/wlm/Desktop/XXX/XXX 2.执行下面的命令: defaults write com.apple.finder AppleShowAllFil ...
- Nginx-ingress-controller部署
参考官网https://kubernetes.github.io/ingress-nginx/ 部署pod:nginx-ingress-controller/nginx-default-backend ...
- OpenACC 简单的直方图
▶ 简单的直方图,强调原子操作的使用 ● 代码 #include <stdio.h> #include <stdlib.h> #include <openacc.h> ...
- 21. oracle游标循环例子
事例1: create or replace procedure sp_addProjectQj( ret out number, flowid in number --流程Id) ascursor ...