Java.util.concurrent包学习(二)线程同步控制相关的类

参考资料:锁机制:http://www.blogjava.net/xylz/archive/2010/07/08/325540.html

并发包中提供了几个用于线程同步的类:CountDownLatch、CyclicBarrier、Semphore、Exchanger

1、CountDownLatch

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

CountDownLatch 是一个通用同步工具,它有很多用途。

计数 1 初始化的 CountDownLatch 用作一个简单的开/关锁存器,或入口:在通过调用 countDown() 的线程打开入口前,所有调用 await 的线程都一直在入口处等待。

用 N 初始化的 CountDownLatch 可以使一个线程在 N 个线程完成某项操作之前一直等待,或者使其在某项操作完成 N 次之前一直等待。(API文档)

await会造成一个线程的阻塞,直到countdown到0;文档中说CountDownLatch 等待的是事件,也就是countdown到0,即之前的所有所需操作完成。

 

2、CyclicBarrier

一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。

 

多个线程共同工作,一个常用的比方是:大家一起出游,分别到达集合地点,共同去往目的地;到达目的地,分散活动,午餐时间集合;餐后分散,结束后集合回程。这种先分别执行,达到某一时间点,线程间相互等待,共同执行后,再分散,在集中的情形。

 

以上二者的区别:

CountDownLatch适用于有明确先后顺序的两组操作,前一组完成后开启后一组,开启功能完成(countdown到0),失去作用;await使线程等待,结束等待条件是countdown到0.

CyclicBarrier适用于多个线程之间需要相互等待,即线程的任务间有分-合-分-合的关系,只有个线程都达到条件后才能进行下一步操作(合),CyclicBarrier可以循环使用;await使线程等待,结束等待条件是等待的线程达到要求数目。

 

3、信号量Semaphore

Semaphore 通常用于限制可以访问某些资源(物理或逻辑的)的线程数目。包含一个阻塞队列,信号量维护了一个许可集,在线程访问资源前,先要获取许可,许可通过acquire获取,若许可不可得则线程阻塞。release用于释放许可。流程:获取许可,同步获取资源,释放资源,释放许可。

 

4、Exchanger

用于线程间成对的交换数据,当一方数据准备好后调用exchange会等待另一方数据准备完成。

每个线程将条目上的某个方法呈现给 exchange 方法,与伙伴线程进行匹配,并且在返回时接收其伙伴的对象。(文档看不太明白)

exchanger参考http://hi.baidu.com/hxzon/item/d13c10deb656d2ef3cc2cb48

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值