【CountDownLatch、CyclicBarrier和Semaphore】
http://www.cnblogs.com/dolphin0520/p/3920397.html
【CountDownLatch同步工具类】
http://www.importnew.com/15731.html
CountDownLatch是什么
CountDownLatch是在java1.5被引入的,跟它一起被引入的并发工具类还有CyclicBarrier、Semaphore、ConcurrentHashMap和BlockingQueue,它们都存在于java.util.concurrent包下。CountDownLatch这个类能够使一个线程等待其他线程完成各自的工作后再执行。例如,应用程序的主线程希望在负责启动框架服务的线程已经启动所有的框架服务之后再执行。
CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的数量。每当一个线程完成了自己的任务后,计数器的值就会减1。当计数器值到达0时,它表示所有的线程已经完成了任务,然后在闭锁上等待的线程就可以恢复执行任务。

CountDownLatch如何工作
CountDownLatch.java类中定义的构造函数:
//Constructs a CountDownLatch initialized with the given count.
public void CountDownLatch(int count) {...}
构造器中的计数值(count)实际上就是闭锁需要等待的线程数量。这个值只能被设置一次,而且CountDownLatch没有提供任何机制去重新设置这个计数值。
与CountDownLatch的第一次交互是主线程等待其他线程。主线程必须在启动其他线程后立即调用CountDownLatch.await()方法。这样主线程的操作就会在这个方法上阻塞,直到其他线程完成各自的任务。
其他N 个线程必须引用闭锁对象,因为他们需要通知CountDownLatch对象,他们已经完成了各自的任务。这种通知机制是通过CountDownLatch.countDown()方法来完成的;每调用一次这个方法,在构造函数中初始化的count值就减1。所以当N个线程都调用了这个方法,count的值等于0,然后主线程就能通过await()方法,恢复执行自己的任务。

在实时系统中的使用场景
1.实现最大的并行性:有时我们想同时启动多个线程,实现最大程度的并行性。例如,我们想测试一个单例类。如果我们创建一个初始计数为1的CountDownLatch,并让所有线程都在这个锁上等待,那么我们可以很轻松地完成测试。我们只需调用 一次countDown()方法就可以让所有的等待线程同时恢复执行。
2.开始执行前等待n个线程完成各自任务:例如应用程序启动类要确保在处理用户请求前,所有N个外部系统已经启动和运行了。
3.死锁检测:一个非常方便的使用场景是,你可以使用n个线程访问共享资源,在每次测试阶段的线程数目是不同的,并尝试产生死锁。

常见面试题
可以为你的下次面试准备以下一些CountDownLatch相关的问题:
解释一下CountDownLatch概念?
CountDownLatch 和CyclicBarrier的不同之处?
给出一些CountDownLatch使用的例子?

CountDownLatch 类中主要的方法?
CountDownLatch(int)
await()
await(long,TimeUnit)
CountDown()
getCount()
toString

在网上看到很多人对于CountDownLatch和CyclicBarrier的区别简单理解为CountDownLatch是一次性的,而CyclicBarrier在调用reset之后还可以继续使用
那如果只是这么简单的话,我觉得CyclicBarrier简单命名为ResetableCountDownLatch好了,显然不是的。
我的理解是,要从他们的设计目的去看这两个类。javadoc里面的描述是这样的。
CountDownLatch: A synchronization aid that allows one or more threads to wait until a set of operations being performed in other threads completes.
CyclicBarrier : A synchronization aid that allows a set of threads to all wait for each other to reach a common barrier point.

CountDownLatch和CyclicBarrier本质是一样的,都是在每个Thread 设置 CountDownLatch或CyclicBarrier 的屏障点point, 每个Thread 计入的Condition 中队列, 执行到屏障点point时候,回调 CountDownLatch或CyclicBarrier 的await方法,在Condition 中队列遍历是否所有的Thread 都已经执行到屏障点point。但是并没有释放Thread ,Thread 一致是运行状态(可以理解成时等待其他Thread全部完成屏障点point)。
区别是:
每个Thread 到达 CountDownLatch的屏障点point 可以调用 countDown()计数-1,到全部为计数0的时候,全部其他Thread通过,继续执行或结束。
所有到达 CyclicBarrier 的屏障点point 时候,该屏障点point 结束,继续执行。如果不能全部到达(中断、失败或者超时等原因),设置 BrokenBarrierException引起所有调用await方法的“Thread”全部报错,全部要么全不 (all-or-none) 的破坏模式。
reset也是抛出BrokenBarrierException。
简而言之,CyclicBarrier 实现一致性,CountDownLatch简单计数

转载于:https://www.cnblogs.com/lsx1993/p/4631733.html

CountDownLatch和CyclicBarrier的区别相关推荐

  1. 多线程之CountDownLatch和CyclicBarrier的区别和用法

    一.CountDownLatch的使用 CountDownLatch经常用于监听某些初始化操作,等初始化执行完毕后,再通知主线程继续工作. CountDownLatch定义: 一个同步辅助类,在完成一 ...

  2. JUC多线程:CountDownLatch、CyclicBarrier、Semaphore同步器原理总结

    一.CountDownLatch: 1.什么是 CountDownLatch: CountDownLatch,闭锁,就是一个基于 AQS 共享模式的同步计数器,它内部的方法都是围绕 AQS 实现的.主 ...

  3. Semaphore、CountDownLatch和CyclicBarrier

    这三者都是java并发包的工具类,提供了比synchronized更加高级的各种同步结构,可以实现更加丰富的多线程操作. Semaphore 信号量,我们应该都在操作系统课程里学过,它是解决进程间通信 ...

  4. Java并发编程工具类:CountDownLatch、CyclicBarrier、Semaphore

    在jdk5中,java提供了一些非常有用的辅助工具类,包括CountDownLatch和CyclicBarrier(两者都可以实现线程之间的通信).Semaphore(控制方法被线程访问的数量),他们 ...

  5. CountDownLatch与CyclicBarrier使用与理解

    CountDownLatch 我之前遇到过这么一个需求:"客户端同时下载视频.音频和大量试题压缩包".我让线程池分配三个线程同时开启下载三类数据,等到它们都下载完成时再进行数据整合 ...

  6. Java的CountDownLatch和CyclicBarrier的理解和区别

    CountDownLatch和CyclicBarrier的功能看起来很相似,不易区分,有一种谜之的神秘.本文将通过通俗的例子并结合代码讲解两者的使用方法和区别. CountDownLatch和Cycl ...

  7. CountDownLatch,CyclicBarrier,Semaphore的使用方法以及它们之间的区别

    在 JUC 下包含了一些常用的同步工具类,今天就来详细介绍一下,CountDownLatch,CyclicBarrier,Semaphore 的使用方法以及它们之间的区别. 一.CountDownLa ...

  8. CountDownLatch、CyclicBarrier、Semaphore的区别,你知道吗?

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:是时候扔掉Postman了,又一个被低估的IDEA插件出来了...个人原创+1博客:点击前往,查看更多 链接:h ...

  9. Thread.join(), CountDownLatch、CyclicBarrier和 Semaphore区别,联系及应用

    在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法, 由于 ...

最新文章

  1. php禁止伪造_php防止伪造的数据从URL提交方法
  2. Android应用--QR的生成(二维码)
  3. MPLS 具有哪些特点?——Vecloud
  4. 关于方程求根的解决方案
  5. SAP CRM WebClient UI element id generation logic
  6. 2013年3月16日星期六
  7. Linux内存管理:ARM64体系结构与编程之cache(1)
  8. [访问系统] C#计算机信息类ComputerInfo (转载)
  9. 剑指offer——面试题56:链表中环的入口
  10. C/C++算法竞赛代码框架
  11. 系统分析和设计方法之数据建模和分析
  12. python 绘图库_Python安装可视化绘图库,你真的会了吗?一文告诉你全部
  13. android视频录制、另一部手机实时观看方案
  14. 分享一段可以直接下载新浪微博视频的小程序
  15. 人工智能期末复习(一)
  16. ES6 --promise了解
  17. 计算机表格按性别排列,excel表格数据男女分类-Excel 按性别(男女)排序
  18. MAE学习 论文阅读与学习 源码阅读
  19. 麒麟980/麒麟970/麒麟960处理器有什么区别?Kirin980/Kirin970/Kirin960参数对比
  20. 什么是3D模型,什么是GLTF,又如何使用GLTF文件

热门文章

  1. 禁止迅雷:迅雷服务器地址大全+ISA计算机集(xml)
  2. win7下import pytorch报错AttributeError: function 'AddDllDirectory' not found
  3. MySQL8安装,初始化,登录和修改密码
  4. Varnish——CDN加速的实现(多个后端服务器实现负载均衡、虚拟主机)
  5. Linux下如何手动搭建论坛?
  6. 2-字符串能否构成三角形及何种三角形
  7. kubernetes不同的命名空间下的容器能通信吗_在Kubernetes环境中,容器间如何进行网络通信?...
  8. Python Debug调试技巧
  9. 图网络笔记-知识补充与node2vec代码注解
  10. 10 tf.data模块