文章目錄
- 一、概述
- 二、使用方法
一、概述
- DCL(Double-Checked Locking)是一種用于在多線程環境下實現延遲初始化的技術。它結合了懶加載(Lazy Initialization)和線程安全性,用于在需要時創建單例對象或共享資源。它的目標是在保持高性能的同時,確保只有一個線程執行對象的初始化過程。
- DCL 的基本思想是在懶加載模式下使用雙重檢查機制,即在首次訪問時檢查鎖定狀態,以避免每次訪問都進行同步。該模式通常應用于單例模式或其他需要延遲初始化的情況。
- DCL 的目標是在保證線程安全的同時,盡可能地減少同步開銷,以提高性能。通過雙重檢查,只有在對象未被創建的情況下才會進行同步和初始化操作,避免了每次訪問都進行同步,從而提高了執行效率。
- DCL 也存在一些問題,主要是由于編譯器和處理器的優化行為可能導致問題。在早期的 Java 版本中,DCL 在某些情況下可能出現線程安全性問題,即使使用了 volatile 關鍵字。這是由于指令重排序和內存可見性的特性所致。自從 Java 5 版本以后,通過使用 volatile 關鍵字修飾的雙重檢查鎖定模式已經被修復,可以正常工作。
- DCL 結合了 volatile 、 synchronized 關鍵字的使用,請看 volatile 使用說明、synchronized 使用說明。
二、使用方法
-
DCL 主要用于單例模式的實現,即確保一個類只有一個實例對象,并提供一個全局訪問點。
-
DCL 的實現通常基于以下步驟:
- 檢查對象是否已經被創建。如果已經創建,則直接返回對象。
- 如果對象尚未創建,則嘗試獲取鎖。
- 獲取鎖后,再次檢查對象是否已經被創建(在獲取鎖之前的檢查只是為了避免不必要的同步)。
- 如果對象尚未創建,則進行對象的創建和初始化。
- 釋放鎖。
- 返回對象。
-
使用方法如下,Singleton 是一個在高并發下,多線要使用的延遲初始化單例類
public class Singleton {private static volatile Singleton instance;private Singleton() {// 私有構造函數}public static Singleton getInstance() {if (instance == null) { // 1.檢查對象是否已經被創建synchronized (Singleton.class) { // 2.嘗試獲取鎖if (instance == null) { // 3.再次檢查對象是否已經被創建instance = new Singleton();// 4.如果對象尚未創建,則進行對象的創建和初始化}}// 5.釋放鎖(synchronized 語句塊結束自動釋放鎖)}return instance; // 6.返回對象} }
需要注意的是 Singleton instance 對象的定義需要使用 volatile 關鍵字。