對單例模式這一部落格的理解。
在多執行緒時不能正常工作,因為沒有加synchronized 所以嚴格來說不能算是單例模式。
public
class
singleton
;public
static singleton getinstance()
return instance;
}}
public
class
singleton()
;//對static方法新增synchronized,鎖住的是該類的class例項
public
static
synchronized singleton getinstance()
return instance;
}}
public
class
singleton
;public
static singleton getinstance()
}
public
class
singleton
public
static singleton getsingleton()
}}return singleton;
}}
為什麼要在singleton變數前加volatile ?這是希望volatile保證物件構造過程中的有序性。
要理解這個問題,先要了解物件的構造過程,例項化乙個物件其實可以分為三個步驟:
(1)分配記憶體空間。
(2)初始化物件。
(3)將記憶體空間的位址賦值給對應的引用。
但是由於作業系統可以對指令進行重排序,所以上面的過程也可能會變成如下過程:
(1)分配記憶體空間。
(2)將記憶體空間的位址賦值給對應的引用。
(3)初始化物件
如果是這個流程,多執行緒環境下就可能將乙個未初始化的物件引用暴露出來,從而導致不可預料的結果。因此,為了防止這個過程的重排序,我們需要將變數設定為volatile型別的變數。
單例模式理解
單例模式 三要素 1 私有的構造方法 2 私有的靜態的例項物件 3 公共的靜態的提供訪問方法 根據單例模式的建立時機可以將其分為兩種型別 1 懶漢模式 在系統初始化時不會做初始化,會在什麼時候使用到時做初始化操作。public class ehanmoshi private static lanha...
單例模式理解
摘要 本文首先概述了單例模式產生動機,揭示了單例模式的本質和應用場景。緊接著,我們給出了單例模式在單執行緒環境下的兩種經典實現 餓漢式 和懶漢式,但是餓漢式是執行緒安全的,而懶漢式是非執行緒安全的。在多執行緒環境下,我們特別介紹了五種方式來在多執行緒環境下建立執行緒安全的單例,即分別使用synchr...
理解設計模式 單例模式
定義 確保要建立的類只有乙個例項 對於頻繁建立的物件,可以省略其建立時間,同時可以減輕gc的壓力 避免對共享資源的多重占用 使用場景 單例模式寫法很多,這裡列舉以下三種 1 最簡單的寫法 使用列舉物件public enum singletonenum使用列舉還可以避免反射獲取類的私有構造方法從而建立...