保證乙個類只有乙個例項:執行緒池、快取、日誌物件,spring中的bean預設單例。
核心:乙個私有靜態變數、乙個私有建構函式、乙個公有靜態函式。
2.1 懶漢式實現
通過私有靜態變數被延遲例項化。
優點:如果沒有用到該類,那麼就不會進行例項化,節約資源。
多執行緒下不安全:
pulic class
singleton
public static single getinstance()
return instance;
}}
實現執行緒安全:
public static synchronized single getinstance()
return instance;
}
2.2 餓漢式實現
直接例項化,不會產生執行緒不安全問題,但是失去了延遲例項化的好處。
實現:
private static singleton instance =
newsingleton()
;
2.3 雙重校驗鎖實現
先判斷是否例項化,如果沒有例項化,才對例項化語句進行加鎖。
public class
singleton
public static singleton getinstance()
}}return instance;
}}
instance採用volatile修飾的必要性,instance = new singleton();這句**分為三步執行:
初始化instance
為instance分配空間
將instance指向分配的空間
重排後可能變為231,設定了instance指向分配好的記憶體空間,但是還沒有初始化物件,加入volatile關鍵字可以禁止重排序。
由於jvm具有指令重排的特性,在多執行緒下會導致乙個執行緒獲得還沒有初始化的例項。volatile關鍵字可以禁止重排,保證多執行緒下正常執行。
volatile關鍵字:
volatile修飾的變數會在讀寫操作前後插入記憶體屏障,可以禁止指令進行重排。
可以保證有序性、可見性。
但是不能保證原子性。
2.4 靜態內部類實現
當singleton類被載入時,靜態內部類singletonholder沒有被載入進記憶體,只有當呼叫getinstance方法從而觸發singletonholder.instance時singleton才會被載入,此時初始化instance例項,並且jvm能確保instance只被例項 化一次。
優點:具有延時初始化的好處,還保證了執行緒安全。
public class
singleton
private static
class
singletonholder
public static singleton getinstance()
}
單例模式總結
三種實現單例模式的對比 1.volatile關鍵字不但可以防止指令重排,也可以保證執行緒訪問的變數值是 主記憶體中的最新值 有關volatile的詳細原理,我在以後的漫畫中會專門講解。2.使用列舉實現的單例模式,不但可以防止利用反射強行構建單例物件 可以而且在列舉類物件被 反序列化 的時候,保證反序...
單例模式總結
單例模式的使用有乙個必要的條件,在乙個系統要求乙個類只有乙個例項時才應當使用單例模式。在懶漢式單例的時候為什麼要進行執行緒的控制呢?package 單例模式.懶漢模式 public class lazysingleton synchronized public lazysingleton getin...
單例模式總結
一 單例模式 singleton pattern 單例模式只涉及到乙個單一的類,該類負責建立自己的物件,同時確保只有單個物件被建立。並且提供了訪問其唯一物件的方式,可以直接訪問,不需要在外部例項化該類的物件。1 單例模式可總結為以下三點 1 構造方法使用private私有化 保證外部無法new出例項...