
死神---三番隊(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