门闩CountDownLatch

2018-10-26  本文已影响0人  larQ

挂多把锁,当所有的锁都释放掉后 才执行

一般用于有前后顺序的地方 ,比如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();
        
    }
}
上一篇下一篇

猜你喜欢

热点阅读