`
javawebsoa
  • 浏览: 408362 次
社区版块
存档分类
最新评论

(12)java5的CountDownLatch、Exchanger同步工具

 
阅读更多

【1】CountDownLatch

java.util.concurrent

类 CountDownLatch
java.lang.Object
java.util.concurrent.CountDownLatch

public class CountDownLatchextends Object一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。


用给定的计数 初始化 CountDownLatch。由于调用了 countDown() 方法,所以在当前计数到达零之前,await 方法会一直受阻塞。
之后,会释放所有等待的线程,await 的所有后续调用都将立即返回。
这种现象只出现一次——计数无法被重置。如果需要重置计数,请考虑使用 CyclicBarrier。


CountDownLatch 是一个通用同步工具,它有很多用途。
将计数 1 初始化的 CountDownLatch 用作一个简单的开/关锁存器,或入口:
在通过调用 countDown() 的线程打开入口前,所有调用 await 的线程都一直在入口处等待。
用 N 初始化的 CountDownLatch 可以使一个线程在 N 个线程完成某项操作之前一直等待,或者使其在某项操作完成 N 次之前一直等待。


CountDownLatch 的一个有用特性是,

它不要求调用 countDown 方法的线程等到计数到达零时才继续,而在所有线程都能通过之前,它只是阻止任何线程继续通过一个 await。


示例用法: 下面给出了两个类,其中一组 worker 线程使用了两个倒计数锁存器:


第一个类是一个启动信号,

在 driver 为继续执行 worker 做好准备之前,它会阻止所有的 worker 继续执行。
第二个类是一个完成信号,它允许 driver 在完成所有 worker 之前一直等待。




另一种典型用法是,将一个问题分成 N 个部分,用执行每个部分并让锁存器倒计数的 Runnable 来描述每个部分,然后将所有 Runnable 加入到 Executor 队列。当所有的子部分完成后,协调线程就能够通过 await。
(当线程必须用这种方法反复倒计数时,可改为使用 CyclicBarrier。)


内存一致性效果:线程中调用 countDown() 之前的操作 happen-before 紧跟在从另一个线程中对应 await() 成功返回的操作。


await
public void await()
throws InterruptedException使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断。
如果当前计数为零,则此方法立即返回。


如果当前计数大于零,则出于线程调度目的,将禁用当前线程,且在发生以下两种情况之一前,该线程将一直处于休眠状态:


由于调用 countDown() 方法,计数到达零;或者
其他某个线程中断当前线程。
如果当前线程:

在进入此方法时已经设置了该线程的中断状态;或者
在等待时被中断,
则抛出 InterruptedException,并且清除当前线程的已中断状态。


抛出:
InterruptedException - 如果当前线程在等待时被中断


应用实例:


运行结果:


线程pool-1-thread-1正在等待命令
线程pool-1-thread-3正在等待命令
线程pool-1-thread-2正在等待命令
线程main正准备发布命令
线程main已发布命令,等待回应
线程pool-1-thread-3已接到命令,开始执行
线程pool-1-thread-2已接到命令,开始执行
线程pool-1-thread-1已接到命令,开始执行
线程pool-1-thread-3已完成命令,发出回应
线程pool-1-thread-2已完成命令,发出回应
线程pool-1-thread-1已完成命令,发出回应
线程main已收到全部回应


【2】Exchanger


java.util.concurrent
类 Exchanger<V>
java.lang.Object
java.util.concurrent.Exchanger<V>
类型参数:
V - 可以交换的对象类型




public class Exchanger<V>extends Object可以在对中对元素进行配对和交换的线程的同步点。
每个线程将条目上的某个方法呈现给 exchange 方法,与伙伴线程进行匹配,并且在返回时接收其伙伴的对象。
Exchanger 可能被视为 SynchronousQueue 的双向形式。Exchanger 可能在应用程序(比如遗传算法和管道设计)中很有用。


用法示例:以下是重点介绍的一个类,该类使用 Exchanger 在线程间交换缓冲区,
因此,在需要时,填充缓冲区的线程获取一个新腾空的缓冲区,并将填满的缓冲区传递给腾空缓冲区的线程。



内存一致性效果:对于通过 Exchanger 成功交换对象的每对线程,每个线程中在 exchange() 之前的操作 happen-before 从另一线程中相应的 exchange() 返回的后续操作。






exchange


public V exchange(V x)
throws InterruptedException等待另一个线程到达此交换点(除非当前线程被中断),然后将给定的对象传送给该线程,并接收该线程的对象。
如果另一个线程已经在交换点等待,则出于线程调度目的,继续执行此线程,并接收当前线程传入的对象。


当前线程立即返回,接收其他线程传递的交换对象。


如果还没有其他线程在交换点等待,则出于调度目的,禁用当前线程,且在发生以下两种情况之一前,该线程将一直处于休眠状态:


其他某个线程进入交换点;或者
其他某个线程中断当前线程。
如果当前线程:


在进入此方法时已经设置了该线程的中断状态;或者
在等待交换时被中断,
则抛出 InterruptedException,并且清除当前线程的已中断状态。


参数:
x - 要交换的对象
返回:
另一个线程提供的对象
抛出:
InterruptedException - 如果当前线程在等待时被中断.


应用实例:



运行结果:


线程pool-1-thread-1要交换的数据为aaa
线程pool-1-thread-2要交换的数据为bbb
线程pool-1-thread-1已准备好交换
线程pool-1-thread-2已准备好交换
线程pool-1-thread-2交换成功,交换到的数据为aaa
线程pool-1-thread-1交换成功,交换到的数据为bbb

分享到:
评论

相关推荐

    java并发工具包 java.util.concurrent中文版用户指南pdf

    12. 闭锁 CountDownLatch 13. 栅栏 CyclicBarrier 14. 交换机 Exchanger 15. 信号量 Semaphore 16. 执行器服务 ExecutorService 17. 线程池执行者 ThreadPoolExecutor 18. 定时执行者服务 ScheduledExecutorService ...

    java并发工具包详解

    1. java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...

    Java并发工具包java.util.concurrent用户指南中英文对照阅读版.pdf

    java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...

    Java并发工具包java.util.concurrent用户指南中英文对照阅读版

    12. 闭锁 CountDownLatch 13. 栅栏 CyclicBarrier 14. 交换机 Exchanger 15. 信号量 Semaphore 16. 执行器服务 ExecutorService 17. 线程池执行者 ThreadPoolExecutor 18. 定时执行者服务 ScheduledExecutorService ...

    java并发包资源

    12. 闭锁 CountDownLatch 13. 栅栏 CyclicBarrier 14. 交换机 Exchanger 15. 信号量 Semaphore 16. 执行器服务 ExecutorService 17. 线程池执行者 ThreadPoolExecutor 18. 定时执行者服务 ScheduledExecutorService ...

    Java并发包讲解

    java并发包讲解 可以找我要代码,qq 3341386488 ## 线程安全-并发容器JUC--...## Concurrent同步工具类 countDownLatch CyclicBarrier Semaphore Exchanger ReenTrantLock ReentrantReadWriteLock 等等

    Java并发编程原理与实战

    并发工具类Exchanger详解.mp4 CountDownLatch,CyclicBarrier,Semaphore源码解析.mp4 提前完成任务之FutureTask使用.mp4 Future设计模式实现(实现类似于JDK提供的Future).mp4 Future源码解读.mp4 ForkJoin框架详解....

    龙果java并发编程完整视频

    第40节并发工具类Exchanger详解00:13:47分钟 | 第41节CountDownLatch,CyclicBarrier,Semaphore源码解析00:29:57分钟 | 第42节提前完成任务之FutureTask使用00:11:43分钟 | 第43节Future设计模式实现(实现类似于...

    龙果 java并发编程原理实战

    第40节并发工具类Exchanger详解00:13:47分钟 | 第41节CountDownLatch,CyclicBarrier,Semaphore源码解析00:29:57分钟 | 第42节提前完成任务之FutureTask使用00:11:43分钟 | 第43节Future设计模式实现(实现类似于...

    Java并发编程(学习笔记).xmind

    同步工具类 闭锁 *应用场景 (1)确保某个计算在其需要的所有资源都被初始化后才能继续执行 (2)确保某个服务在其所依赖的所有其他服务都已经启动之后才启动 (3)等待知道某个操作...

    Java并发编程应该掌握的并发工具类,快来看看你掌握了哪些?

    在我们JDK的并发包中,提供了几个非常有用的并发工具类,比如:CountDownLatch 闭锁、CyclicBarrier 同步屏障、Semaphore 信号量,在线程之间交换数据的一种方式 Exchanger,赶紧操练起来。 2、CountDownLatch 闭锁 ...

    Java 并发编程原理与实战视频

    第40节并发工具类Exchanger详解00:13:47分钟 | 第41节CountDownLatch,CyclicBarrier,Semaphore源码解析00:29:57分钟 | 第42节提前完成任务之FutureTask使用00:11:43分钟 | 第43节Future设计模式实现(实现类似于...

    java线程并发semaphore类示例

    Java 5.0里新加了4个协调线程间进程的同步装置,它们分别是Semaphore, CountDownLatch, CyclicBarrier和Exchanger,本例主要介绍Semaphore,Semaphore是用来管理一个资源池的工具,可以看成是个通行证

    java并发编程

    第40节并发工具类Exchanger详解00:13:47分钟 | 第41节CountDownLatch,CyclicBarrier,Semaphore源码解析00:29:57分钟 | 第42节提前完成任务之FutureTask使用00:11:43分钟 | 第43节Future设计模式实现(实现类似于...

    JAVA并发编程-2-线程并发工具类

    JAVA并发编程-2-线程并发工具类一、Fork/Join1、分而治之与工作密取2、使用标准范式3、Fork/Join的同步用法4、Fork/Join的异步用法二、CountDownLatch三、CyclicBarrier四、Semaphore信号量五、Exchanger ...

    javaforkjoin源码-gitbook-BAT-interview:本文综合自己在一线互联网工作感悟,经验。记录开源框架的源码解读,数据

    并发同步工具类 [CountDownLatch] [CyclicBarrier] [Semaphore] [Exchanger] Atomic包 并发集合 [BlockQueue] [ArrayBlockingQueue] [ConcurrentLinkedQueue] [PriorityBlockingQueue] [DelayQueue] 并发安全集合 ...

    汪文君高并发编程实战视频资源全集

     高并发编程第三阶段21讲 Exchanger工具的使用以及常见问题分析-上_.mp4  高并发编程第三阶段22讲 Exchanger工具的使用以及常见问题分析-下_.mp4  高并发编程第三阶段23讲 Semaphore工具的介绍以及借助于...

    汪文君高并发编程实战视频资源下载.txt

     高并发编程第三阶段21讲 Exchanger工具的使用以及常见问题分析-上_.mp4  高并发编程第三阶段22讲 Exchanger工具的使用以及常见问题分析-下_.mp4  高并发编程第三阶段23讲 Semaphore工具的介绍以及借助于...

Global site tag (gtag.js) - Google Analytics