zhang-minglei
5/22/2019 - 7:32 AM

CountDownLatch、CyclicBarrier、Semaphore区别

CountDownLatch:

使用AQS CountDownLatch 类位于 java.util.concurrent 包下,利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他4个任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了。

CyclicBarrier:

使用ReentrantLock,在 CyclicBarrier 中,有一个 “代” 的概念,因为 CyclicBarrier 是可以复用的,那么每次所有的线程通过了栅栏,就表示一代过去了 字面意思回环栅栏,通过它可以实现让一组线程等待至某个状态之后再全部同时执行。叫做回环是因为当所有等待线程都被释放以后,CyclicBarrier可以被重用。我们暂且把这个状态就叫做barrier,当调用await()方法之后,线程就处于barrier了。 CyclicBarrier类位于java.util.concurrent包下,CyclicBarrier提供2个构造器: 参数parties指让多少个线程或者任务等待至barrier状态 参数barrierAction为当这些线程都达到barrier状态时会执行的内容

Semaphore:

使用AQS,有公平和非公平之分 Semaphore翻译成字面意思为 信号量,Semaphore 可以同时让多个线程同时访问共享资源,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。

总结

CountDownLatch和CyclicBarrier都能够实现线程之间的等待,只不过它们侧重点不同:

CountDownLatch 一般用于某个线程A等待若干个其他线程执行完任务之后,它才执行; CyclicBarrier 一般用于一组线程互相等待至某个状态,然后这一组线程再同时执行; CountDownLatch 是不能够重用的,而 CyclicBarrier 是可以重用的。 Semaphore 其实和锁有点类似,它一般用于控制对 某组 资源的访问权限,而锁是控制对 某个 资源的访问权限。