怎么解析JUC下CountDownLatch CyclicBarrier,信号量

  介绍

怎么解析JUC下CountDownLatch, CyclicBarrier,信号量,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

<节>

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

一、CountDownLatch

先看一下,CountDownLatch源码的官方介绍。

<图数据工具=癿dnice编辑器”> 怎么解析JUC下CountDownLatch, CyclicBarrier,信号量”>
  图>,</<p>意思是,它是一个同步辅助器,允许一个或多个线程一直等待,直到一组在其他线程执行的操作全部完成。</p> <pre> <代码>公共CountDownLatch (int数){<br/>如果(计数& lt;0)把新IllegalArgumentException(“数& lt;0“);<br/>。同步=new同步(计数);<br/>} <br/> </代码> </pre>
  ,<p>它的构造方法,会传入一个计算值,用于计数。</p> <p>常用的方法有两个:</p> <pre> <代码>公共空等待()抛出InterruptedException {<br/> sync.acquiresharedinterruptibly (1), <br/>} <br/> <br/>公共空倒计时(){<br/> sync.releaseshared (1), <br/>} <br/> </代码> </pre>
  ,<p>当一个线程调用等待方法时,就会阻塞当前线程。每当有线程调用一次倒计时方法时,计数就会减1。当计数的值等于0的时候,被阻塞的线程才会继续运行。</p> <p>现在设想一个场景,公司项目,线上出现了一个紧急错误,被客户投诉,领导焦急的过来,想找人迅速的解决这个bug。</p> <p>那么,一个人解决肯定速度慢啊,于是叫来张三和李四,一起分工解决。终于,当他们两个都做完了自己所需要做的任务之后,领导才可以答复客户,客户也就消气了(没办法啊,客户是上帝嘛)。</p> <p>于是,我们可以设计一个工人类来模拟单个人修复bug的过程,主线程就是领导,一直等待所有工人任务执行结束,主线程才可以继续往下走。</p> <pre> <代码>公共类CountDownTest {<br/>,,静态SimpleDateFormat自卫队=new SimpleDateFormat (“yyyy-MM-dd HH: mm: ss,,公共静态void main (String [] args)抛出InterruptedException {
,,,,CountDownLatch门闩=new CountDownLatch (2),
,,,,工人w1=新工人(“张三“,2000年,门闩);
,,,,工人w2=新工人(“李四“,3000年,门闩);
,,,,w1.start ();
,,,,w2.start ();

,,,长,开始时间=System.currentTimeMillis ();
,,,,latch.await ();
,,,,System.out.println(“错误全部解决,领导可以给客户交差了,任务总耗时:“+ (System.currentTimeMillis()——开始时间)),

,,}

,,静态类工作者线程延伸{
,,,,字符串名称;
,,,,int工作;
,,,,CountDownLatch门闩;

,,,,公共工人(字符串名称、int想出CountDownLatch门闩){
,,,,,,this.name=名字;
,,,,,这。工作=工作;
,,,,,这。门闩=门闩;
,,,,}

,,,,@Override
,,,,公共空间run () {
,,,,,,System.out.println(名字+“开始修复错误,当前时间:“+自卫队。新日期格式(())),
,,,,,,doWork ();
,,,,,,System.out.println(名字+“结束修复错误,当前时间:“+自卫队。新日期格式(())),
,,,,,,latch.countDown ();
,,,,}

,,,,私人空间doWork () {
,,,,,,尝试{
,,,,,,,,//模拟工作耗时
,,,,,,,,thread . sleep(工作);
,,,,,,}捕捉(InterruptedException e) {
,,,,,,,,e.printStackTrace ();
,,,,,}
大敌;,,}
大敌;,}
}
  ,

本来需要5秒完成的任务,两个人3秒就完成了。我只能说,这程序员的工作效率真是太太太高了。

,

二,CyclicBarrier

屏障英文是屏障,障碍,栅栏的意思.cyclic是循环的意思,就是说,这个屏障可以循环使用(什么意思,等下我举例子就知道了)。源码官方解释是:

同步援助,让一组线程都等待对方达到一个共同的障碍点。障碍被称为循环,因为它可以重复使用后等待线程被释放。

一组线程会互相等待,直到所有线程都到达一个同步点。这个就非常有意思了,就像一群人被困到了一个栅栏前面,只有等最后一个人到达之后,他们才可以合力把栅栏(屏障)突破。

CyclicBarrier提供了两种构造方法:

 <代码>公共CyclicBarrier (int政党){
,,这(政党,null);
}
公共CyclicBarrier (int, Runnable barrierAction) {
,,如果(政党& lt;=0)把新IllegalArgumentException ();
,这。方=党;
,这。数=党;
,这。barrierCommand=barrierAction;
}
  null   null   null   null   null   null   null   null

怎么解析JUC下CountDownLatch CyclicBarrier,信号量