原理:CountDownLathch是基于AQS(抽象队列同步器)实现的,在初始化CountDownLatch对象时设置计数器count,并保存在AQS的同步状态变量state里,当线程调用CountDownLatch对象的await()方法时,线程被放入到AQS的阻塞队列,当线程调用CountDownLatch对象的countdown()方法时原子性递减并更新(CAS)计数器count,当count值为0时,调用AQS的doRelaseShared方法激活AQS阻塞队列中的线程。
特点:可以在子线程运行的任何时候让await方法返回而不一定等到线程运行完毕;当让线程池管理线程时,无法使用join方法;因此相比于join方法更加灵活。
原理:CyclicBarrier是基于ReentrantLock实现的,ReentrantLock是基于AQS实现的。在初始化CyclicBarrier对象时设置线程个数值parties和Runnable接口对象。当线程调用CyclicBarrier对象的await()方法时,内部会调用dowait方法(核心方法),具体为线程会获得ReentrantLock对象的锁资源,并进行计数器count的递减操作,若count值不为0,线程会被阻塞挂起放入条件变量trip的条件阻塞队列并释放锁资源。当count值为0时,调用nextGengration()方法唤醒条件队列里的阻塞线程并利用parties重置count,实现CyclicBarrier对象状态重置。
特点:满足计数器重置的需要。
原理:Seamphore是基于AQS实现的,在初始化Seamphore对象时设置信号量个数permits,并保存在AQS的同步状态变量state里,当线程调用Seamphore对象的acquire()系列方法时,会首先获取Seamphore对象的当前信号量state,然后与acquire方法需要的信号量(默认为0)作差,当差值小于0时,线程被放入AQS阻塞队列而被阻塞挂起。当线程调用Seamphore对象的release()系列方法时,会把Seamphore对象的当前信号量值state递增,当state大于acquire方法需要的信号量时,调用unpark方法唤醒因调用acquire方法而被阻塞的线程。
特点:一个是用于多个共享资源的互斥使用,另一个是用于并发线程数的控制。