前言
CountDownLatch
CyclicBarrier
Semaphore🖊
CountDownLatch
CountDownLatch 允许一个或多个线程等待其他线程完成操作。
原始的方法可以使用
join()
,让线程在此等待其他线程执行结束。(join内部实现是不断检查join的线程是否存活,最后用notifyAll通知阻塞在外面的线程)
Java1.5 之后提供了CountDownLatch
,也能实现Join的功能,而且功能更多。
操作
new CountDownLatch(int N)
:构造countDown()
:计数器-1await()
:阻塞,等待计数器到0
1 | static CountDownLatch c = new CountDownLatch(2); // 构造时指定计数器大小 |
CyclicBarrier 同步屏障
可重复使用的屏障,让一组线程到达一个屏障(同步点)后阻塞,直到最后一个线程到达屏障时,所有屏障都才会开门,线程继续运行。
操作
new CyclicBarrier(int N)
:构造方法1,指定计数器大小new CyclicBarrier(int N, Runnable Action)
:指定当所有线程都到达屏障时,屏障打开前执行的动作await()
:到达屏障,计数器-1,线程阻塞于此reset()
:重置屏障计数器为原样getNumberWaiting()
:获得正在阻塞的线程数
使用场景
多线程计算数据,最后合并计算出结果。
Semaphore 信号量
用来控制访问特定公共资源的线程数量。通过协调各个线程保证合理的使用公共资源。
操作
new Semaphore(int N)
:构造,指定资源使用的许可数量acquire()
:release()
: