先来一段 jdk 的示例:

public class Countdownlatch_Test {
    private final static int N = 3;

    public static void main(String[] args) throws InterruptedException {
        CountDownLatch startSignal = new CountDownLatch(1);
        CountDownLatch doneSignal = new CountDownLatch(N);

        for (int i = 0; i < N; ++i)
            // create and start threads
            new Thread(new Worker(startSignal, doneSignal)).start();

        System.out.println("main start"); // don't let run yet

        startSignal.countDown(); // let all threads proceed

        System.out.println("child start");

        doneSignal.await(); // wait for all to finish
    }
}

class Worker implements Runnable {
    private final CountDownLatch startSignal;
    private final CountDownLatch doneSignal;

    Worker(CountDownLatch startSignal, CountDownLatch doneSignal) {
        this.startSignal = startSignal;
        this.doneSignal = doneSignal;
    }

    public void run() {
        try {
            startSignal.await();

            System.out.println(Thread.currentThread().getName());

            doneSignal.countDown();
        } catch (InterruptedException ex) {
        } // return;
    }
}

CountDownLatch 的用法很简单,一个线程 await,其他的线程一直 countDown,当计数为 0 时,await 的线程就会运行。

不管是 CountDownLatch 还是 ReentrantLock,底层实现都是 AbstractQueuedSynchronizer,所以重点是这个类。

 

posted on 2018-07-10 22:46  偶尔发呆  阅读(91)  评论(0)    收藏  举报