CountDownLatch

这个一个JUC并发包下的一个同步工具类,类似于门栓

例如:实现一个容器,提供两个方法,add,size,写两个线程,线程1添加10个元素到容器,线程2实现监控元素的个数,当个数到5个时,线程2给出提示并结束

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/**
* 采用CountDownLatch工具类实现
* 俩个门栓解决
*/
public class JUC01_2 {
List list = new ArrayList();

public int size(){
return list.size();
}

public void add(Object o){
list.add(o);
}

public static void main(String[] args) {
JUC01_2 juc01_2 = new JUC01_2();
CountDownLatch latch1 = new CountDownLatch(1);
CountDownLatch latch2 = new CountDownLatch(1);
new Thread(()->{
System.out.println("t2 启动");
if (juc01_2.size()!=5){
try {
latch1.await();//进入等待状态,直到计数器为0
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("t2 结束");
latch2.countDown();
},"t2").start();

new Thread(()->{
System.out.println("t1 启动");
for (int i = 0; i < 10; i++) {
juc01_2.add(i);
System.out.println("add "+i);

if (juc01_2.size()==5){
latch1.countDown();//计数器减1
try {
latch2.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
},"t1").start();
}
}

countDown() 计数器减1

await() 阻塞,当计数器为0时才继续执行

await(long timeout, TimeUnit unit)

getCount() 获取计数器当前值

缺点: CountDownLatch是一次性的,计数器只能初始化一次,用完后不能再次被使用