Java并发编程之CountDownLatch:深入解析与实战案例

一、CountDownLatch简介
CountDownLatch,翻译成中文就是计数器闭锁。它是一个同步辅助类,主要用于在并发编程中实现线程间的协作。CountDownLatch的原理是提供一个计数器,计数器的初始值由调用者指定。每当一个线程完成了自己的任务后,就调用countDown()方法,计数器值减1。只有当计数器的值变为0时,那些因为调用await()方法而阻塞的线程才会继续执行。
二、CountDownLatch的用法
CountDownLatch的使用非常简单,以下是CountDownLatch的基本用法:
1. 创建CountDownLatch实例,并指定初始值。
```java
CountDownLatch latch = new CountDownLatch(3);
```
这里的3表示有3个线程需要完成自己的任务。
2. 在主线程中调用await()方法,阻塞主线程。
```java
latch.await();
```
3. 在子线程中完成自己的任务后,调用countDown()方法。
```java
latch.countDown();
```
4. 当所有子线程都完成了自己的任务,计数器的值变为0,主线程继续执行。
三、CountDownLatch的实战案例
下面通过一个简单的案例来展示CountDownLatch在并发编程中的应用。
假设有3个线程分别执行不同的任务,只有当所有任务都完成后,主线程才继续执行。
```java
public class CountDownLatchDemo {
public static void main(String[] args) throws InterruptedException {
CountDownLatch latch = new CountDownLatch(3);
// 创建并启动3个线程
new Thread(() -> {
System.out.println("线程1开始执行...");
// 模拟任务执行
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程1任务完成,调用countDown()...");
latch.countDown();
}).start();
new Thread(() -> {
System.out.println("线程2开始执行...");
// 模拟任务执行
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程2任务完成,调用countDown()...");
latch.countDown();
}).start();
new Thread(() -> {
System.out.println("线程3开始执行...");
// 模拟任务执行
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程3任务完成,调用countDown()...");
latch.countDown();
}).start();
// 等待所有线程任务完成
System.out.println("主线程等待所有线程任务完成...");
latch.await();
System.out.println("所有线程任务完成,主线程继续执行...");
}
}
```
输出结果如下:
```
线程1开始执行...
线程2开始执行...
线程3开始执行...
线程1任务完成,调用countDown()...
线程2任务完成,调用countDown()...
线程3任务完成,调用countDown()...
主线程等待所有线程任务完成...
所有线程任务完成,主线程继续执行...
```
通过这个案例,我们可以看到CountDownLatch在实现线程间协作方面的作用。
四、CountDownLatch的注意事项
1. CountDownLatch的初始值必须大于0,否则会抛出IllegalArgumentException异常。
2. CountDownLatch只能使用一次,因为它内部有一个volatile的计数器。一旦计数器的值变为0,await()方法会立即返回,此时CountDownLatch就失去了作用。
3. CountDownLatch的await()方法默认是非阻塞的,如果需要阻塞等待,可以添加超时时间。
五、总结
CountDownLatch是Java并发编程中一个非常有用的同步辅助类。通过本文的介绍,相信大家对CountDownLatch有了更深入的了解。在实际项目中,CountDownLatch可以用来实现线程间的协作,提高程序的性能。






