CountDownLatch
同步辅助类,它允许一个或多个线程等待其他线程完成操作后再继续执行
- **核心理念:****计数器 + 阻塞**
- **构造器:**
CountDownLatch latch = new CountDownLatch(int count);
count = 需要等待的事件数(或线程数)
使用:latch.await() 这时候线程就会park,并进入q,state++。countdown():try state == 0,里面有个 dorelease,就会for node: q, node即Thread,然后LockSuport.unpark()
底层原理:
还是基于AQS,可见AQS的抽象能力和通用性,
核心就是 计数器归零唤醒所有等待线程
常用场景
常用于我们的一些需要聚合数据的业务场景中,比如前端的一个页面需要多个组件的数据进行聚合,那么这时候就可以使用countDownLatch开多个线程
还有模拟高并发场景,同时唤醒多个请求任务,唤醒这个操作是比较轻量级的,虽然底层是for(T
thread:q)但几乎能做到同时