注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

Android开发之十六同步CountDownLatch和CyclicBarrier的区别  

2015-03-18 13:17:59|  分类: Android |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

Android开发之十六同步CountDownLatchCyclicBarrier的区别

 

CountDownLatchCyclicBarrierJDK较早提供的两个同步的类,在JDK7中提供了更新的Phaser Exchanger同步辅助类。这里只说前面两个。

先看一下在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.

很明显,一般粗通英文的都可以明白,前者指一个或者多个线程等待一组线程完成后才能工作;而CyclicBarrier则是一组线程互相等待(或者说彼此等待)在某个同步点(有些书上叫“在集合点的同步”,大家明白意思就成。)只有全部这些线程都OK,才会继续工作。

CyclicBarrier可以重复使用,而CountDownLatch只能使用一次。

CyclicBarrier被重置后,await()方法上等待的线程将收到一个BrokenBarrierException异常。另外,其还有一个特殊的状态叫损坏状态(Broken),当有很多的线程在await时,如果有一个线程被中断,这个线程将抛出InterruptedException异常。其它的等待线程将抛出BrokenBarrierException异常。于是CyclicBarrier对象就处理损坏状态了。

CountDownLatch是一个单纯递减的计数器,线程之间没有关系;而CyclicBarrier相当于一个总体的控制器,线程必须彼此等待。完成后再继续执行。当await等待的线程被中断,也会抛出InterruptedException异常。

它们共同点是:其内部都有一个定时计数器,一旦条件达到,所有在await上等待的线程都开始干活。

这里对CyclicBarrier参数中带Runnable的需要详细说明一下:

如果在生成CyclicBarrier对象时传入了Runnable参数,那么其条件达到后,先执行Runnable线程,然后再执行所有的await阻塞住的线程后的代码。看下面的例子:

CyclicBarrier(int,Runnable):

Await()

条件到达:

执行:Runnable

然后:await后面的代码

 

好好学习,天天向上。

  评论这张
 
阅读(361)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017