閱讀Druid原始碼對併發包下面CountDownLatch的學習
阿新 • • 發佈:2019-02-13
前言
- 閒來閱讀了下druid的原始碼,在DruidDataSource類中,CountDownLatch的使用引起了我的注意,特地寫這篇文章來記錄一下學習到的東西。
countDownLatch的概念
- 座標:java.util.concurrent.CountDownLatch。
- 用於同步, 如操作必須要等待某些前提條件初始化完成之後才能觸發。
countDownLatch和Join的區別
- join需要等待執行緒完成之後才能執行
- countDownLatch只需要等待計數為0時,就能開始執行,控制更加靈活。
Druid中的用法
- private final CountDownLatch initedLatch = new CountDownLatch(2);
- 這裡的意思是,當前執行需要等待紅框中的兩部分,必要的邏輯執行後,採用initedLatch.countDown();,將計數減為0後才開始執行。才算初始化完畢。
做實驗
- 實驗場景一,主執行緒必須要等待2個執行緒為map分別設定值後才停止
- 方式一,採用join方式
- 方式二,採用更加靈活的countDownLatch方式
package com.thread.countDownLatchTestSinglePd;
import java.util.concurrent.CountDownLatch;
public class Singleton {
private static Singleton instance;
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
public static void main(String[] args) {
CountDownLatch countDownLatch = new CountDownLatch(1);
for (int i = 0; i < 10000; i++) {
new Thread(() -> {
try {
//所有執行緒都等待鎖
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Singleton.getInstance().hashCode());
}).start();
//釋放鎖,模擬執行緒併發
countDownLatch.countDown();
}
}
}