挂多把锁,当所有的锁都释放掉后 才执行
- 可以和锁混合使用,或替代锁的功能。
- 在门闩未完全开放之前等待。当门闩完全开放后执行。
- 避免锁的效率低下问题。
一般用于有前后顺序的地方 ,比如spring 容器初始化,要先初始化什么 再初始化什么,然后在做什么事情; 每次做完一件事后 就减(释放)去一把锁
public class TestSync {
//门闩 相当于 挂5把锁 ,当这5把锁一次都 释放时 才执行
CountDownLatch latch = new CountDownLatch(5);
void m1() {
try {
latch.await(); //等待 门闩上的 锁 全部释放
} catch (InterruptedException e) {
e.printStackTrace();
}
}
void m2() {
for (int i = 0; i < 10; i++) { //循环释放锁
if(latch.getCount()!=0) { // 不等于0 也就是说 还有锁
latch.countDown();//释放一把锁
System.out.println("m1(执行了)");
}
}
}
public static void main(String[] args) {
TestSync t = new TestSync();
new Thread(new Runnable() {
@Override
public void run() {
t.m1(); //第一个线程 先执行m1() 需要等待 5把锁开放
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
t.m2();
}
}).start();
}
}