單例模式總結

2021-10-03 09:36:32 字數 1545 閱讀 7385

保證乙個類只有乙個例項:執行緒池、快取、日誌物件,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出例項...