剖析Java里的CountDownLatch:玩转线程同步
2023-09-22 18:58:20
CountDownLatch:一种协调线程执行的强大工具
什么是CountDownLatch?
CountDownLatch是一种同步类,它允许多个线程等待一组操作完成,再继续执行。它的工作原理很简单:CountDownLatch有一个计数器,它跟踪尚未完成的操作数量。当计数器为0时,所有等待的线程都会被唤醒。
CountDownLatch的用法
使用CountDownLatch非常简单。首先,创建一个CountDownLatch对象,并指定初始计数器的值。然后,在需要等待的线程中,调用CountDownLatch的countDown()
方法来减少计数器的值。当计数器减为0时,所有等待的线程都会被唤醒。
以下是一个示例代码:
//创建一个初始计数为3的CountDownLatch
CountDownLatch latch = new CountDownLatch(3);
//创建三个线程,每个线程都会调用countDown()方法减少计数器
for (int i = 0; i < 3; i++) {
new Thread(() -> {
//模拟耗时操作
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//调用countDown()方法减少计数器
latch.countDown();
}).start();
}
//等待计数器减为0,然后再继续执行
try {
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("所有线程都执行完了");
CountDownLatch的实战案例
CountDownLatch在Java开发中有很多应用场景,包括:
- 多线程计算: 协调多个线程同时进行计算,并汇总结果。
- 分布式系统: 确保在所有节点准备好之前不开始操作。
- 游戏开发: 确保所有玩家加载完资源后才开始游戏。
- 测试: 确保在测试用例开始执行之前,所有先决条件都已满足。
总结
CountDownLatch是一个功能强大的工具,可以让你轻松协调多线程执行。理解它的工作原理和使用方法对于编写健壮、高性能的多线程应用程序至关重要。
常见问题解答
-
CountDownLatch和CyclicBarrier有什么区别?
CyclicBarrier是一个高级同步工具,它可以协调多个线程在执行相同屏障之前和之后进行同步,而CountDownLatch只关注完成操作的数量。 -
CountDownLatch的计数器可以增加吗?
不可以。CountDownLatch的计数器只能递减,不能增加。 -
CountDownLatch的
await()
方法是否会一直阻塞线程?
如果计数器尚未减为0,await()
方法将一直阻塞线程,直到计数器减为0。 -
CountDownLatch是否可以被中断?
可以,CountDownLatch的await()
方法可以被InterruptedException
中断。 -
CountDownLatch的
countDown()
方法可以被多次调用吗?
可以,countDown()
方法可以被调用多次,直到计数器减为0。