單例(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 繫結...