CountDownLatch剖析,踏上Java并发之旅
2024-01-13 14:40:41
深入解析CountDownLatch:Java并发之巅的利器
引言
在Java并发编程的广袤世界中,CountDownLatch如同一道耀眼的灯塔,指引着开发者们实现高效的线程协调。 CountDownLatch是一个计数器,它允许一个或多个线程等待,直到计数器变为零。当计数器减为零时,所有等待的线程都会继续执行。
漫步CountDownLatch源码
CountDownLatch的源码简洁明了,约有100行代码。
public class CountDownLatch {
private int count;
public CountDownLatch(int count) {
if (count < 0) {
throw new IllegalArgumentException("count cannot be negative");
}
this.count = count;
}
public void countDown() {
synchronized (this) {
if (count == 0) {
throw new IllegalStateException("count has already reached zero");
}
count--;
if (count == 0) {
notifyAll();
}
}
}
public void await() throws InterruptedException {
synchronized (this) {
while (count > 0) {
wait();
}
}
}
}
CountDownLatch的构造函数接受一个整型参数count,代表初始计数。
CountDownLatch提供了两个关键方法:countDown()和await()。
- countDown()方法: 用于递减计数器的值,每调用一次countDown()方法,计数器就减一。
- await()方法: 用于使当前线程等待,直到计数器变为零。如果在调用await()方法时,计数器不为零,当前线程会被挂起。当其他线程调用countDown()方法时,计数器会减一,并唤醒所有等待的线程。
CountDownLatch的应用场景
CountDownLatch在并行编程中有着广泛的应用,包括:
- 等待多个线程完成任务: CountDownLatch可用于等待多个线程完成任务,然后再继续执行后续任务。
- 控制并发任务: CountDownLatch可用于控制并发任务的数量,防止并发任务过多导致系统崩溃。
- 实现屏障: CountDownLatch可用于实现屏障,确保所有线程都到达某个点之后,才能继续执行。
举例来说, 我们在主线程中启动了10个子线程,每个子线程执行一个任务,主线程需要等待这10个子线程都完成任务后,再执行后续任务。我们可以使用CountDownLatch来实现:
public class Main {
public static void main(String[] args) throws InterruptedException {
CountDownLatch latch = new CountDownLatch(10); // 设置初始计数为10
// 启动10个子线程
for (int i = 0; i < 10; i++) {
new Thread(() -> {
// 执行子线程任务
// ...
// 执行完毕后,计数器减一
latch.countDown();
}).start();
}
// 主线程等待所有子线程完成任务
latch.await();
// 所有子线程完成任务后,继续执行后续任务
// ...
}
}
结语
CountDownLatch是一个非常有用的工具,它可以帮助我们协调并发任务,并实现各种各样的功能。 CountDownLatch的源码简洁明了,通过阅读源码,我们可以更深入地理解CountDownLatch的原理和用法。
常见问题解答
- CountDownLatch和CyclicBarrier有什么区别?
CountDownLatch是一次性的计数器,而CyclicBarrier是一个可重复使用的计数器。CountDownLatch在计数器减为零后不再可用,而CyclicBarrier可以在计数器减为零后重置计数器并继续使用。
- CountDownLatch和Semaphore有什么区别?
CountDownLatch是一个单一的计数器,而Semaphore是一个通用的资源计数器。CountDownLatch只能用于等待,而Semaphore可以用于等待或限制资源的访问。
- CountDownLatch和Barrier有什么区别?
Barrier是CountDownLatch的扩展,它允许线程在到达屏障时执行操作。而CountDownLatch只允许线程在计数器减为零时继续执行。
- CountDownLatch可以在多线程环境中使用吗?
是的,CountDownLatch可以在多线程环境中使用。CountDownLatch是线程安全的,它提供了synchronized方法来保证多线程并发访问时的正确性。
- CountDownLatch可以用于替代锁吗?
一般来说,CountDownLatch不适合用于替代锁。锁用于控制对资源的独占访问,而CountDownLatch用于协调线程之间的同步。