返回

揭秘 CountDownLatch 内部原理,助你轻松实现多线程同步协作

Android

CountDownLatch:Java 并发编程中的同步利器

什么是 CountDownLatch?

在多线程编程中,有时你需要等待其他线程完成任务才能继续执行。CountDownLatch 就是一个专门用来处理这种场景的同步工具。它允许线程等待一组操作完成,然后才继续执行。

CountDownLatch 的特点

  • 计数器: 指定需要等待的线程数量。
  • 计数递减: 每个线程完成任务后,计数器会递减。
  • 唤醒线程: 当计数器减为 0 时,所有等待的线程都会被唤醒。
  • 一次性: CountDownLatch 是不可重用的,一旦使用完毕就不能再次使用。

CountDownLatch 的用法

CountDownLatch 的使用非常简单:

  1. 创建 CountDownLatch: 指定需要等待的线程数量。
  2. 在要等待的线程中调用 countDown() 每个线程完成任务后调用 countDown() 来递减计数器。
  3. 在等待线程中调用 await() 等待其他线程完成任务。

CountDownLatch 的原理

CountDownLatch 内部使用了一个计数器和一个条件变量来实现同步。当一个线程调用 await() 时,它会进入等待状态,直到计数器减为 0。而当一个线程调用 countDown() 时,它会递减计数器,如果计数器减为 0,则会唤醒所有等待的线程。

CountDownLatch 的示例

以下是一个简单的 CountDownLatch 示例:

import java.util.concurrent.CountDownLatch;

public class CountDownLatchExample {

    public static void main(String[] args) {
        // 创建一个 CountDownLatch,计数器为 3
        CountDownLatch latch = new CountDownLatch(3);

        // 创建三个子线程,每个线程完成任务后调用 `countDown()`
        for (int i = 0; i < 3; i++) {
            new Thread(() -> {
                try {
                    // 模拟任务执行
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                // 完成任务后递减计数器
                latch.countDown();
            }).start();
        }

        // 主线程等待其他线程完成任务
        try {
            latch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 所有任务完成,继续执行主线程
        System.out.println("所有任务已完成");
    }
}

CountDownLatch 的优点

  • 简单易用: 使用方便,只需要指定等待的线程数量即可。
  • 高性能: 内部实现高效,资源消耗少。
  • 广泛应用: 适用于多种多线程同步场景,例如主线程等待子线程完成、线程池管理等。

常见问题解答

  1. CountDownLatch 和 CyclicBarrier 有什么区别?
    • CountDownLatch 是一个一次性的同步工具,而 CyclicBarrier 可以重复使用。
  2. CountDownLatch 和 Semaphore 有什么区别?
    • CountDownLatch 允许线程等待一组操作完成,而 Semaphore 则允许控制同时访问共享资源的线程数量。
  3. 如何避免 CountDownLatch 出现死锁?
    • 确保所有等待的线程最终都会调用 countDown()
  4. CountDownLatch 可以用于哪些场景?
    • 主线程等待所有子线程完成任务。
    • 多个线程协作完成复杂任务。
    • 控制线程池中的线程数量。
  5. 使用 CountDownLatch 时有哪些注意事项?
    • 使用 CountDownLatch 时要注意死锁问题。
    • 使用 CountDownLatch 时要注意资源回收问题。

结论

CountDownLatch 是 Java 并发编程中一个非常有用的同步工具。它可以轻松实现多线程之间的同步协作,让你的代码更加安全和高效。下次遇到多线程同步问题时,别忘了试试 CountDownLatch 吧!