1、CountdownLatch又叫闭锁
首先CountdownLatch 是一次性的锁。使用后锁状态就消失。
允许一个或多个线程阻塞,等待前置线程执行完后后,即计数器减为零时,阻塞的线程才继续执行。调用await()方法的线程进行阻塞,前置线程调用countDown()计数器减一。
2、CyclicBarrier 栅栏锁
CyclicBarrier是可以重复使用的,基于可重入锁ReentrantLock和Condition状态实现。当一组线程中的某一线程执行到达栅栏时调用 barrier.await() 先把自己阻塞起来,等待这一组中的所有线程都执行到达后才继续往下执行
当有线程到达屏障调用await() 使用ReetrantLock的ConditionObject的等待队列,通过向Condition中等待队列添加元素实现阻塞,当条件满足唤醒等待队列中的线程,依次序执行。
3. Semaphore 基于AQS实现的用来限制访问特定资源的线程数
前两者的区别:闭锁是要等待前置线程执行完成。栅栏锁是这一组本身全部执行到达条件时才能继续