返回

剖析Java里的CountDownLatch:玩转线程同步

后端

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是一个功能强大的工具,可以让你轻松协调多线程执行。理解它的工作原理和使用方法对于编写健壮、高性能的多线程应用程序至关重要。

常见问题解答

  1. CountDownLatch和CyclicBarrier有什么区别?
    CyclicBarrier是一个高级同步工具,它可以协调多个线程在执行相同屏障之前和之后进行同步,而CountDownLatch只关注完成操作的数量。

  2. CountDownLatch的计数器可以增加吗?
    不可以。CountDownLatch的计数器只能递减,不能增加。

  3. CountDownLatch的await()方法是否会一直阻塞线程?
    如果计数器尚未减为0,await()方法将一直阻塞线程,直到计数器减为0。

  4. CountDownLatch是否可以被中断?
    可以,CountDownLatch的await()方法可以被InterruptedException中断。

  5. CountDownLatch的countDown()方法可以被多次调用吗?
    可以,countDown()方法可以被调用多次,直到计数器减为0。