Java并发编程(七)——闭锁、同步屏障、信号量详解
来源:互联网 发布:花生壳怎么管理域名 编辑:程序博客网 时间:2024/05/21 02:50
转自:http://blog.csdn.net/u010425776/article/details/54580082
目录(?)[+]
- 闭锁CountDownLatch
- 1 使用场景
- 2 代码实现
- 同步屏障CyclicBarrier
- 1 使用场景
- 2 闭锁 与 同步屏障 的区别
- 3 代码实现
- 信号量Semaphore
- 1 使用场景
- 2 代码实现
1. 闭锁:CountDownLatch
1.1 使用场景
若有多条线程,其中一条线程需要等到其他所有线程准备完所需的资源后才能运行,这样的情况可以使用闭锁。
1.2 代码实现
// 初始化闭锁,并设置资源个数CountDownLatch latch = new CountDownLatch(2);Thread t1 = new Thread( new Runnable(){ public void run(){ // 加载资源1 加载资源的代码…… // 本资源加载完后,闭锁-1 latch.countDown(); }} ).start();Thread t2 = new Thread( new Runnable(){ public void run(){ // 加载资源2 资源加载代码…… // 本资源加载完后,闭锁-1 latch.countDown(); }} ).start();Thread t3 = new Thread( new Runnable(){ public void run(){ // 本线程必须等待所有资源加载完后才能执行 latch.await(); // 当闭锁数量为0时,await返回,执行接下来的任务 任务代码…… }} ).start();
2. 同步屏障:CyclicBarrier
2.1 使用场景
若有多条线程,他们到达屏障时将会被阻塞,只有当所有线程都到达屏障时才能打开屏障,所有线程同时执行,若有这样的需求可以使用同步屏障。此外,当屏障打开的同时还能指定执行的任务。
2.2 闭锁 与 同步屏障 的区别
- 闭锁只会阻塞一条线程,目的是为了让该条任务线程满足条件后执行;
- 而同步屏障会阻塞所有线程,目的是为了让所有线程同时执行(实际上并不会同时执行,而是尽量把线程启动的时间间隔降为最少)。
2.3 代码实现
// 创建同步屏障对象,并制定需要等待的线程个数 和 打开屏障时需要执行的任务CyclicBarrier barrier = new CyclicBarrier(3,new Runnable(){ public void run(){ //当所有线程准备完毕后触发此任务 }});// 启动三条线程for( int i=0; i<3; i++ ){ new Thread( new Runnable(){ public void run(){ // 等待,(每执行一次barrier.await,同步屏障数量-1,直到为0时,打开屏障) barrier.await(); // 任务 任务代码…… } } ).start();}
3. 信号量:Semaphore
3.1 使用场景
若有m个资源,但有n条线程(n>m),因此同一时刻只能允许m条线程访问资源,此时可以使用Semaphore控制访问该资源的线程数量。
3.2 代码实现
// 创建信号量对象,并给予3个资源Semaphore semaphore = new Semaphore(3);// 开启10条线程for ( int i=0; i<10; i++ ) { new Thread( new Runnbale(){ public void run(){ // 获取资源,若此时资源被用光,则阻塞,直到有线程归还资源 semaphore.acquire(); // 任务代码 …… // 释放资源 semaphore.release(); } } ).start();}
阅读全文
0 0
- Java并发编程(七)——闭锁、同步屏障、信号量详解
- Java并发编程的艺术(八)——闭锁、同步屏障、信号量详解
- Java并发编程的艺术(八)——闭锁、同步屏障、信号量详解
- Java并发编程 06 闭锁、同步屏障、信号量详解
- 闭锁、同步屏障、信号量详解
- java并发基础(二)--- Java监视器模型、并发容器、同步工具类(闭锁、信号量)
- Java并发编程 闭锁Latch
- Java同步工具类——闭锁
- Java并发编程之闭锁CountDownLatch简介
- Java并发编程实战--闭锁 CountDownLatch
- java并发之同步屏障CyclicBarrier
- Synchronizer 闭锁(CountDownLatch,FutureTask ) 信号量(Semaphore) 关卡(CyclicBarrier) 知识点总结(java并发编程实践读书笔记三)
- java并发之同步工具类一之闭锁Latch
- java多线程并发---闭锁
- Java并发编程——Semaphore (信号量)和CountDownLatch
- 同步工具类闭锁,栅栏,信号量
- Java并发编程:synchronized多线程同步详解
- Java并发编程之闭锁CountDownLatch和栅栏(CyclicBarrier)
- java 锁优化
- 【Redis】----Redis字符串(String)
- 理解fork函数
- Rdd,DataFrame和DataSet的区别
- svn客户端及服务端
- Java并发编程(七)——闭锁、同步屏障、信号量详解
- Hadoop伪分布式环境搭建
- 关于jdbc连接mysql的一点小总结
- xml解析之XmlPullParser解析器
- <c:forEach>标签报isValid()==false错问题
- Tensorflow函数——tf.set_random_seed(seed)
- 内网和外网
- java socket tcpip多线程网络通信服务器客户端
- FastCGI和CGI的区别