1. 程式人生 > >閱讀Druid原始碼對併發包下面CountDownLatch的學習

閱讀Druid原始碼對併發包下面CountDownLatch的學習

前言

  • 閒來閱讀了下druid的原始碼,在DruidDataSource類中,CountDownLatch的使用引起了我的注意,特地寫這篇文章來記錄一下學習到的東西。

countDownLatch的概念

  • 座標:java.util.concurrent.CountDownLatch。
  • 用於同步, 如操作必須要等待某些前提條件初始化完成之後才能觸發。

countDownLatch和Join的區別

  • join需要等待執行緒完成之後才能執行
  • countDownLatch只需要等待計數為0時,就能開始執行,控制更加靈活。

Druid中的用法

druid中的countDownLatch

  • private final CountDownLatch initedLatch = new CountDownLatch(2);
  • 這裡的意思是,當前執行需要等待紅框中的兩部分,必要的邏輯執行後,採用initedLatch.countDown();,將計數減為0後才開始執行。才算初始化完畢。

做實驗

  • 實驗場景一,主執行緒必須要等待2個執行緒為map分別設定值後才停止
    • 方式一,採用join方式
    • 方式二,採用更加靈活的countDownLatch方式

join

這裡寫圖片描述

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(); } } }