并發(fā)編程-(8)-CountDownLatch原理

死神---三番隊(duì)隊(duì)長(zhǎng)市丸銀

目錄:

  • 1、CountDownLatch介紹

    • 1.1、CountDownLatch介紹
  • 2、CountDownLatch使用

    • 2.1、countDown()/await()
  • 3、CountDownLatch最佳實(shí)戰(zhàn)

    • 3.1、zookeeper建立連接
  • 4、CountDownLatch源碼分析

    • 4.1、AQS共享鎖分析
  • 5、面試常見(jiàn)問(wèn)題

    • 5.1、解釋一下CountDownLatch概念?
    • 5.2、CountDownLatch 類(lèi)中主要的方法?
    • 5.3、CountDownLatch 和CyclicBarrier的不同之處?
    • 5.4、給出一些CountDownLatch使用的例子?

1、CountDownLatch介紹

定義:CountDownLatch 是一個(gè)同步工具類(lèi),它允許一個(gè)或多個(gè)線(xiàn)程一直等待(WATTING),直到其他線(xiàn)程的操作執(zhí)行完畢再執(zhí)行。從命名可以解讀到 countdown 是倒數(shù)的意思,類(lèi)似于我們倒計(jì)時(shí)的概念。

2、CountDownLatch使用

2.1、countDown()/await()
public class TestCountDownLatchMain {

    public static void main(String[] args) throws InterruptedException {
        CountDownLatch countDownLatch = new CountDownLatch(3);
        System.out.println(DateUtil.getNowYYMMDDHHMMSS()+" start run!");
        new Thread(() -> {
            countDownLatch.countDown();
        }, "t1").start();
        new Thread(() -> {
            countDownLatch.countDown();
        }, "t2").start();
        new Thread(() -> {
            try {
                System.out.println(DateUtil.getNowYYMMDDHHMMSS()+" thread sleep 5s!");
                TimeUnit.SECONDS.sleep(5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            countDownLatch.countDown();
        }, "t3").start();
        countDownLatch.await();
        System.out.println(DateUtil.getNowYYMMDDHHMMSS()+" 所有線(xiàn)程執(zhí)行完畢");
    }

}

運(yùn)行結(jié)果如下:

2020-01-12 17:29:36, start run!
2020-01-12 17:29:36, thread sleep 5s!
2020-01-12 17:29:41, 所有線(xiàn)程執(zhí)行完畢

Process finished with exit code 0

3、CountDownLatch最佳實(shí)戰(zhàn)

3.1、zookeeper建立連接
public class ZooKeeperConnectionDemo {

    private static ZooKeeper zooKeeper = null;

    public static void main(String[] args) {
        CountDownLatch countDownLatch = new CountDownLatch(1);
        try {
            zooKeeper =
                    new ZooKeeper("xx.xx.xx.115:2181,",
                            4000, new Watcher() {
                        public void process(WatchedEvent watchedEvent) {
                            if (Event.KeeperState.SyncConnected == watchedEvent.getState()) {
                                //如果收到了服務(wù)端的響應(yīng)事件,連接成功
                                System.out.println("創(chuàng)建連接成功watche!");
                                countDownLatch.countDown();
                            }
                        }
                    });
            countDownLatch.await();
            System.out.println("主線(xiàn)程zk狀態(tài):"+zooKeeper.getState());//CONNECTED

        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (KeeperException e) {
            e.printStackTrace();
        }
    }
zookeeper連接狀態(tài):

CONNECTING, ASSOCIATING, CONNECTED, CONNECTEDREADONLY,CLOSED, AUTH_FAILED, NOT_CONNECTED
建立連接通過(guò)添加watcher回調(diào)很好的控制了連接狀態(tài),當(dāng)watchedEvent狀態(tài)等于SyncConnected,才標(biāo)志著與zookeeper服務(wù)端建立好了。

4、CountDownLatch源碼分析

4.1、AQS共享鎖分析
image.png


問(wèn)題:thread-a 也執(zhí)行await(),會(huì)發(fā)生啥?

5、面試常見(jiàn)問(wèn)題

  • 解釋一下CountDownLatch概念?
  • CountDownLatch 類(lèi)中主要的方法?
    • countDown(); 減掉state的值。
    • await(); 當(dāng)state值==0,喚醒等待的線(xiàn)程。
  • CountDownLatch 和CyclicBarrier的不同之處?
  • 給出一些CountDownLatch使用的例子?
    • 類(lèi)似zookeeper建立連接。
    • 單元測(cè)試模擬高并發(fā)。
image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容