![](https://img.haomeiwen.com/i2845835/b611c48e583ec45c.png)
目录:
-
1、CountDownLatch介绍
-
1.1、CountDownLatch介绍
-
-
2、CountDownLatch使用
-
2.1、countDown()/await()
-
-
3、CountDownLatch最佳实战
-
3.1、zookeeper建立连接
-
-
4、CountDownLatch源码分析
-
4.1、AQS共享锁分析
-
-
5、面试常见问题
-
5.1、解释一下CountDownLatch概念?
-
5.2、CountDownLatch 类中主要的方法?
-
5.3、CountDownLatch 和CyclicBarrier的不同之处?
-
5.4、给出一些CountDownLatch使用的例子?
-
1、CountDownLatch介绍
定义:CountDownLatch 是一个同步工具类,它允许一个或多个线程一直等待(WATTING)
,直到其他线程的操作执行完毕再执行。从命名可以解读到 countdown 是倒数的意思,类似于我们倒计时的概念。
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()+" 所有线程执行完毕");
}
}
运行结果如下:
2020-01-12 17:29:36, start run!
2020-01-12 17:29:36, thread sleep 5s!
2020-01-12 17:29:41, 所有线程执行完毕
Process finished with exit code 0
3、CountDownLatch最佳实战
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()) {
//如果收到了服务端的响应事件,连接成功
System.out.println("创建连接成功watche!");
countDownLatch.countDown();
}
}
});
countDownLatch.await();
System.out.println("主线程zk状态:"+zooKeeper.getState());//CONNECTED
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (KeeperException e) {
e.printStackTrace();
}
}
zookeeper连接状态:
CONNECTING, ASSOCIATING, CONNECTED, CONNECTEDREADONLY,CLOSED, AUTH_FAILED, NOT_CONNECTED
建立连接通过添加watcher回调很好的控制了连接状态,当watchedEvent状态等于SyncConnected,才标志着与zookeeper服务端建立好了。
4、CountDownLatch源码分析
4.1、AQS共享锁分析
![](https://img.haomeiwen.com/i2845835/0dd831ad3e42cc1e.png)
问题:thread-a 也执行await(),会发生啥?
5、面试常见问题
- 解释一下CountDownLatch概念?
- CountDownLatch 类中主要的方法?
- countDown(); 减掉state的值。
- await(); 当state值==0,唤醒等待的线程。
- CountDownLatch 和CyclicBarrier的不同之处?
- 给出一些CountDownLatch使用的例子?
- 类似zookeeper建立连接。
- 单元测试模拟高并发。
![](https://img.haomeiwen.com/i2845835/bbee23960fe764c6.png)
网友评论