【Java多线程与并发库】12.java5的Semaphere同步工具
来源:互联网 发布:遥感影像匀光匀色软件 编辑:程序博客网 时间:2024/06/05 15:45
Semaphore(信号灯)
(1)概念
Semaphore可以维护当前访问自身的线程个数,并提供了同步机制。使用Semaphore可以
控制同时访问资源的线程个数,例如实现一个文件允许的并发访问数。
Semaphore实现的功能就类似于餐厅有5个座位,假如有10人要就餐,但同时只能
有5个人能够坐下,当5个人的任何一个人让开后,其中在等待的另外5个人中又有
一个人可以坐下了。
(2)实例
例子:
我们开启了一个动态的缓存线程池,提供了3个信号灯,这样一来一次只有3个线程能拥有
这个信号灯,并且只有有线程使用完信号灯之后,才会有下一个线程获取信号灯并执行。
效果:
可以看到,只有当某一个线程让出其信号灯的使用权之后,其它线程才能够获取信号灯
并且开始执行它自己的线程。
(3)线程获得信号灯的机会
对于另外等待信号灯释放的线程可以是随机获得优先机会,也可以是按照先来后到的顺序获得机会,
这取决于构造Semaphore对象时传入的参数选项。
构造方法摘要:
Semaphore(int permits)
创建具有给定的许可数和非公平的公平设置的 Semaphore。
Semaphore(int permits, boolean fair)
创建具有给定的许可数和给定的公平设置的 Semaphore。
参数:
permits - 初始的可用许可数目。此值可能为负数,在这种情况下,必须在授予任何获取前进行释放。
fair - 如果此信号量保证在争用时按先进先出的顺序授予许可,则为 true;否则为 false。
(4)防止死锁
单个信号量的Semaphore对象可以实现互斥锁的功能,并且可以是由一个线程获得了“锁”,
另一个线程也可以释放该“锁”,这让就防止某个线程死掉了,然后又不释放信号灯的使用权,
此时可以由其线程进行释放。这可应用于死锁恢复的一些场合。
(1)概念
Semaphore可以维护当前访问自身的线程个数,并提供了同步机制。使用Semaphore可以
控制同时访问资源的线程个数,例如实现一个文件允许的并发访问数。
Semaphore实现的功能就类似于餐厅有5个座位,假如有10人要就餐,但同时只能
有5个人能够坐下,当5个人的任何一个人让开后,其中在等待的另外5个人中又有
一个人可以坐下了。
(2)实例
例子:
我们开启了一个动态的缓存线程池,提供了3个信号灯,这样一来一次只有3个线程能拥有
这个信号灯,并且只有有线程使用完信号灯之后,才会有下一个线程获取信号灯并执行。
package cn.edu.hpu.test;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Semaphore;public class SemaphoreTest { public static void main(String[] args) { ExecutorService service = Executors.newCachedThreadPool();//开启一个动态缓存线程池 final Semaphore sp = new Semaphore(3);//设置3个信号灯 for (int i = 0; i < 10; i++) { Runnable runnable = new Runnable(){ public void run() { try { sp.acquire();//获得一盏灯的使用权 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("线程"+Thread.currentThread().getName()+"进入"); try { Thread.sleep((long)Math.random()*10000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("线程"+Thread.currentThread().getName() +"即将离开"); sp.release();//释放信号灯的使用权 System.out.println("线程"+Thread.currentThread().getName()+"已离开。"); } }; service.execute(runnable); } }}
效果:
可以看到,只有当某一个线程让出其信号灯的使用权之后,其它线程才能够获取信号灯
并且开始执行它自己的线程。
(3)线程获得信号灯的机会
对于另外等待信号灯释放的线程可以是随机获得优先机会,也可以是按照先来后到的顺序获得机会,
这取决于构造Semaphore对象时传入的参数选项。
构造方法摘要:
Semaphore(int permits)
创建具有给定的许可数和非公平的公平设置的 Semaphore。
Semaphore(int permits, boolean fair)
创建具有给定的许可数和给定的公平设置的 Semaphore。
参数:
permits - 初始的可用许可数目。此值可能为负数,在这种情况下,必须在授予任何获取前进行释放。
fair - 如果此信号量保证在争用时按先进先出的顺序授予许可,则为 true;否则为 false。
(4)防止死锁
单个信号量的Semaphore对象可以实现互斥锁的功能,并且可以是由一个线程获得了“锁”,
另一个线程也可以释放该“锁”,这让就防止某个线程死掉了,然后又不释放信号灯的使用权,
此时可以由其线程进行释放。这可应用于死锁恢复的一些场合。
转载请注明出处:http://blog.csdn.net/acmman/article/details/52948307
1 0
- 【Java多线程与并发库】12.java5的Semaphere同步工具
- java5的Semaphere同步工具(十四)
- 【Java多线程与并发库】13.java5的CyclicBarrier同步工具
- 【Java多线程与并发库】14.java5的CountDownLatch同步工具
- 【Java多线程与并发库】15.java5的Exchanger同步工具
- (11)java5的Semaphere、CyclicBarrier同步工具
- (11)java5的Semaphere、CyclicBarrier同步工具
- 【Java多线程与并发库】17.java5同步集合类的应用
- 【Java多线程与并发库】8.java5线程并发库之线程池的应用
- 【Java多线程与并发库】8.java5线程并发库之线程池的应用
- 【Java多线程与并发库】10.java5的线程锁(读写锁)技术
- 【Java多线程与并发库】11.java5条件阻塞Condition的应用
- 【Java多线程与并发库】16.java5阻塞队列的应用
- (14)多线程与并发库之java5同步集合类的应用【包含jdk1.5新特性 ConcurrentHashMap】
- (14)多线程与并发库之java5同步集合类的应用【包含jdk1.5新特性 ConcurrentHashMap】
- 多线程及java5的线程并发库
- 【张孝祥并发课程笔记】13:java5的同步工具简介
- 多线程并发库高级应用 之 使用java5中同步技术的3个面试题
- java给定日期区间计算其中的周几有几天
- 预报在线:发送短信中,对用户登录的判断和区分一般信息快报和重大信息快报,以选取不同的sql获取不同的用户;
- TextView 显示 html
- git reset revert 回退回滚取消提交返回上一版本
- OpenSSL 使用 base64 编码/解码
- 【Java多线程与并发库】12.java5的Semaphere同步工具
- Snmp协议、串口协议、UDP、TCP/IP协议 的学习与总结
- Material Design 风格 结合使用 Retrofit RxJava Jsoup Mvp 模式的一款资讯类 学习 app
- JAVA常用基础知识点[继承,抽象,接口,静态,枚举,反射,泛型,多线程...]
- 小试1
- TCP/IP网络编程 -- 摘要四五
- 安卓开发——androidstudio中怎么加载字体资源
- 部分可见的侧边菜单与交叉渐变效果的SlidingPaneLayout
- iOS开发 JSPatch(热修复) 基础用法详解