闭锁概念
- 闭锁是一种同步工具类,可以延迟线程的进度直到其到达终止状态
- 在闭锁到达结束状态之前,没有任何线程能通过
- 当到达结束状态时,允许所有的线程通过
- 当闭锁到达结束状态后,将不会再改变状态,因此将永远保持打开状态
- 闭锁可以用来确保某些活动直到其他活动都完成后才继续执行
CountDownLatch类
作用
CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。使用一个计数器进行实现。计数器初始值为线程的数量。当每一个线程完成自己任务后,计数器的值就会减一。当计数器的值为0时,表示所有的线程都已经完成一些任务,然后在CountDownLatch上等待的线程就可以恢复执行接下来的任务。
CountDownLatch是一种灵活的闭锁实现,可以在上述各种情况中使用,它可以使一个或多个线程等待一组事件发生。闭锁状态包括一个计数器,该计数器被初始化为一个正数,表示需要等待的事件数量。
countDown方法递减计数器,表示有一个事件已经发生了
wait方法等待计数器达到零,这表示所有需要等待的事件都已经发生
如果计数器的值非零,那么wait会一直阻塞直到计数器为零,或者等待中的线程中断,或者等待超时。
可以向CountDownLatch对象设置一个初始的数字作为计数值,任何调用这个对象上的wait()方法都会阻塞,直到这个计数器的计数值被其他的线程减为0为止。
使用countDownLatch,启动门可以保证主线程同时释放所有工作线程而不是先后执行,结束门可以保证主线程等待最后一个线程执行完成
接口
- 初始化计数器(构造函数):CountDownLatch(int count)
- 递减计数器:countDown()
- 等待:wait()
- 获取当前计数器的值:getCount()
数据
- 互斥量mutex_
- 条件变量condition_
- 计数器count_
代码实现
类结构
class CountDownLatch : noncopyable {
public:
explicit CountDownLatch(int count);
void wait();
void countDown();
int getCount() const;
private:
mutable MutexLock mutex_;
Condition condition_;
int count_;
};
函数实现
//初始化计数器
CountDownLatch::CountDownLatch(int count)
: mutex_(), condition_(mutex_), count_(count) { }
//用condition的wait方法等待条件达成
void CountDownLatch::wait() {
MutexLockGuard lock(mutex_);
while(count_ > 0) {
condition_.wait();
}
}
//递减计数器
void CountDownLatch::countDown() {
MutexLockGuard lock(mutex_);
--count_;
if(count_ == 0) {
condition_.notifyAll();
}
}
//返回计数器
int CountDownLatch::getCount() const {
MutexLockGuard lock(mutex_);
return count_;
}
https://blog.csdn.net/KID_LWC/article/details/98269619
https://blog.csdn.net/zhangxiao93/article/details/72677207