参考资料:锁机制: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 通常用于限制可以访问某些资源(物理或逻辑