线程中的同步辅助类Semaphore
同步辅助类 线程池 并发集合类 都是在线程同步的基础上增加了一些同步的东西,在线程同步的基础上更好的实现线程同步.实现的效率更高,更方便而已.
多线程并不是很难 需要你把代码写出来...然后分析运行的效果.
软件包 java.util.concurrent JDK1.5之后才出现的. 同步辅助类提供了更优秀的解决方案.
同步器
四个类可协助实现常见的专用同步语句。
Semaphore 是一个经典的并发工具。
CountDownLatch 是一个极其简单但又极其常用的实用工具,用于在保持给定数目的信号、事件或条件前阻塞执行。
CyclicBarrier 是一个可重置的多路同步点,在某些并行编程风格中很有用。
Exchanger 允许两个线程在 collection 点交换对象,它在多流水线设计中是有用的。
类 Semaphore
一个计数信号量。从概念上讲,信号量维护了一个许可集。
Semaphore中维护了一个可许集,这个可许集的体现就是构造方法中传入一个int值
final Semaphore semaphore = new Semaphore(5);
信号量:Semaphore。
允许临界区(共享内容)内存在固定个数的线程,并发访问。
如果信号量为1.成为二进制信号量,和同步(synchronized) 效果一样。
场景:

一个混沌摊,一开始只有一个桌子,一张桌子同时只能被一个人使用,只有拿到许可之后才可以使用这个桌子. 后来有了5个桌子,最多能允许5个拿到许可的人同时访问.
import java.util.Random;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit; public class SemaphoreDemo { public static void main(String[] args) {
final Semaphore semaphore = new Semaphore(5);
//Semaphore中维护了一个可许集,这个可许集的体现就是构造方法中传入一个int值
//有5个许可,同时允许5个线程同时来拿 for (int i = 0; i < 50; i++) { new Thread(new Runnable() { @Override
public void run() {
try {
semaphore.acquire();//获得一个许可,从5减去1,有许可的才让访问
} catch (InterruptedException e1) {
e1.printStackTrace();
}
System.out.println(Thread.currentThread().getName()
+ " :来了,现在有 "+(5-semaphore.availablePermits())+" 名顾客");//有几名顾客就意味着有多少个并发. try {
TimeUnit.SECONDS.sleep(new Random().nextInt(3));
} catch (InterruptedException e) {
e.printStackTrace();
} System.out.println("-->" + Thread.currentThread().getName()
+ " :走了"); semaphore.release();//释放许可
}
}).start(); }
}
}
线程中的同步辅助类Semaphore的更多相关文章
- 线程中的同步辅助类CountDownLatch
四个类可协助实现常见的专用同步语句.Semaphore 是一个经典的并发工具.CountDownLatch 是一个极其简单但又极其常用的实用工具,用于在保持给定数目的信号.事件或条件前阻塞执行.Cyc ...
- 线程中的同步辅助类Exchanger
Exchanger 允许两个线程在 collection 点交换对象,它在多流水线设计中是有用的. 允许两条线程之间交换数据.Exchanger的exchange方法是阻塞的,当其他线程也调用了该方法 ...
- Java线程中的同步
1.对象与锁 每一个Object类及其子类的实例都拥有一个锁.其中,标量类型int,float等不是对象类型,但是标量类型可以通过其包装类来作为锁.单独的成员变量是不能被标明为同步的.锁只能用在使用了 ...
- python线程中的同步问题
多线程开发可能遇到的问题 假设两个线程t1和t2都要对num=0进行增1运算,t1和t2都各对num修改1000000次,num的最终的结果应该为2000000.但是由于是多线程访问,有可能出现下面情 ...
- JDK中线程中实现同步等待闭环的一种方式
实际Thread类自带的join方法就实现了线程同步等待,具体可以通过案例实践,如下: 本文的重点不是join,而是另一种设计的同步等待实现,涉及的关键类有:Thread.Runable.Callab ...
- java线程中的同步锁和互斥锁有什么区别?
两者都包括对资源的独占. 区别是 1:互斥是通过竞争对资源的独占使用,彼此没有什么关系,也没有固定的执行顺序. 2:同步是线程通过一定的逻辑顺序占有资源,有一定的合作关系去完成任务.
- CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 主要方法 public CountDownLatch(int count); pu ...
- Java中的5种同步辅助类
当你使用synchronized关键字的时候,是通过互斥器来保障线程安全以及对共享资源的同步访问.线程间也经常需要更进一步的协调执行,来完成复杂的并发任务,比如wait/notify模式就是一种在多线 ...
- Java并发编程的4个同步辅助类(CountDownLatch、CyclicBarrier、Semaphore、Phaser)
我在<JDK1.5引入的concurrent包>中,曾经介绍过CountDownLatch.CyclicBarrier两个类,还给出了CountDownLatch的演示案例.这里再系统总结 ...
随机推荐
- java中的四种修饰符:private、protected、public和default的区别
本类 本包 子类 包外 public 可以 可以 可以 可以 protected 可以 可以 可以 不可以 default 可以 可以 不可以 不可以 private 可以 不可以 不可以 不可以 ...
- IntelliJ IDEA 2017版 spring-boot2.0.2 自动配置Condition
描述: 编译器修改参数 -Dfile.encoding=GBK -Dstr.encoding=GBK Condition位置: 某一个类或注解存在的时候,装配,否则不装配 相关代码: ...
- beforeunload事件
window.addEventListener("beforeunload", function (e) { var confirmationMessage = "\o/ ...
- Silverlight4.0正式版(Silverlight4_Tools)离线安装
1.从微软的网站下载Silverlight4_Tools.exe(或者http://download.csdn.net/detail/taomanman/4522848)2.执行Silverlight ...
- sql_id VS hash_value
有没有发现,v$session,v$sql,v$sqlarea,v$sqltext,v$sql_shared_cursor等试图连接的时候经常会用到hash_value,sql_id,但是他们2个之间 ...
- Forward团队-爬虫豆瓣top250项目-设计文档
组长地址:http://www.cnblogs.com/mazhuangmz/p/7603594.html 成员:马壮,李志宇,刘子轩,年光宇,邢云淇,张良 设计方案: 1.能分析HTML语言: 2. ...
- jmeter 4.0版本更新说明(个人做个记录)总版本更新合集
版本4.0 摘要 新的和值得注意的 不兼容的变化 Bug修复 改进 非功能性变化 已知问题和解决方法 谢谢 新的和值得注意的 核心改进 JMeter现在支持JAVA 9. 提供新的边界提取器元件,提供 ...
- POJ2385--Apple Catching(动态规划)
It is a little known fact that cows love apples. Farmer John has two apple trees (which are convenie ...
- iOS处理视图上同时添加单击与双击手势的冲突问题
_bgView.userInteractionEnabled = YES; //在cell上添加 bgView,给bgView添加两个手势检测方法 UITapGestureRecognizer *do ...
- nginx实现unigui群集
nginx实现unigui群集 在笔者写此文的时候,UNIGUI1.50.x的版本已经发布,其提供的HyperServer已经支持群集. 有网友还专门为此做了群集方面的测试: 从上图可以看出:群集总共 ...