DCL 單例是否需要volatile 關鍵字修飾

2021-10-06 02:10:53 字數 1057 閱讀 6278

單例(singleton)

簡答的說就是整個jvm 中只有乙個物件

單例分為懶漢模式和餓漢模式

餓漢: 就是宣告物件的收直接new

public class singleton 

public static singleton getinstance ()

}

懶漢: 在使用的時候建立物件

public class singleton 

public static singleton getinstance ()

return singleton;

}}

以上的方式僅僅針對單執行緒,在併發情況下, 還是會存在多個singleton 物件.

synchronzied 直接載入方法上(不推薦,鎖太重),可以保證併發情況下的只有乙個物件.

優化一下: (懶漢模式)

public class singleton 

public static singleton getinstance ()

}return singleton;

}}

但 這個還不是併發安全的方式

比如thread 1 到 synchronized 處, thread 2 也到這裡,但是thread 2 繼續執行, 呼叫了構造器最後返回, thread 1 繼續執行, 又會執行一次構造器,然後返回,這就導致不是只有乙個物件.

再次優化 就出現 dcl(double check lock) 單例, 在獲取鎖之後,再次檢驗物件是否為 null

public class singleton 

public static singleton getinstance () }}

return singleton;

}}

這裡面使用了volatile, 因為在物件初始化過程中,沒有 volatile ,會發生指令重排序的情況,導致使用半初始化的物件,有了volatile,會禁止指令重排序,所有的指令都是按照順序執行.

DCL單例模式為什麼還需要加volatile

目錄 dcl是什麼 dcl存在什麼問題 volatile如何解決dcl存在的問題 dcl 即雙重驗證加鎖 什麼是雙重驗證加鎖,看下面 public class person public static person getinstance return person 不難看出,就是在單例模式下獲取例...

dcl單例模式

有時候我們需要對外呈現只有乙個物件,簡單來說就是講物件私有化,像資料那樣,只能通過get方法得到。這裡使用doublechecking來進行該操作,即在get方法裡面加入兩個判斷該物件是否為空,同時為了避免指令重排導致執行緒獲得空物件,加入volatile,而且私有化構造器。public class...

DCL單例模式

單例模式 外部不能new物件,類的內部有且只有乙個物件,僅僅用乙個靜態方法與外界進行互動。public class doublecheckedlocking 外部只能通過這個get方法和此物件進行交流 public static doublecheckedlocking getinstance 繫結...