CountDownLatch是一个同步计数器,它可以保证一些线程全部执行完毕后当前再往下一步执行。

新建10条线程,每条运行把当前线程的名称添加到list中,最后打印长度。理想情况下list的长度是10,但是由于线程执行时间的不一致,每次运行list的长度都是可变的。CountDownLatch可以为我们很好的解决这个问题。
1:创建计数器为10的CountDownLatch对象:
2:子线程都执行countDown方法
3:当前线程调用await方法进入阻塞状态
每调用countDown方法就相当与计数-1,当计数器的count数值等于0时,调用await阻塞的线程才会释放,如果计数器的count数值不等于0,那阻塞线程将不会被释放

源码解析


内部自定义集成AQS的同步器Sync,构造CountDownLatch对象传入state作为AQS同步器的计数



每次调用countDown方法会通过CAS算法将计数器count数值-1



state==0时调用线程直接下一步,不等于就进入阻塞队列里面。
网友评论