單例模式 層層剖析尋找最高效安全的單例

2022-04-28 09:01:06 字數 2594 閱讀 1064

什麼是單例?它的運用場景是什麼?

單例模式是指保證在系統中只存在某類唯一物件。運用場景隨處可見,例如工具類、spring容器預設new物件等。

單例模式有幾種實現方式?

餓漢式、懶漢式、雙重檢查鎖式、內部類式、列舉式。

推薦使用方式?

餓漢式、內部類式。

餓漢式顧名思義餓,那麼當應用程式一開始類載入,類的物件立馬例項化載入至jvm。

1

public

class

singletonclass

11 }

為什麼呼叫效率高?沒有延遲載入?

答:假設在高併發的場景下,有10w+併發呼叫,不需要同步處理。可以直接在堆記憶體直接獲取物件不需要任何等待。

同樣,它沒有延遲載入,如果它是需要消耗很大記憶體的物件,最開始就加載入堆記憶體,而使用者暫時不需要。這樣就會嚴重占用堆記憶體,影響執行效率。

導引:腦洞大開的程式設計師們說:上述問題還不簡單,當呼叫的時候在new物件不就行。於是出現了懶漢式的雛形版本。

public

class

singletonclass

return

instance;

}

懶漢式顧名思義懶,就是延遲載入,當被呼叫的時候再例項化。

問題:如果你是初出茅廬的應屆生寫成這樣,估計面試官也不會追究什麼。如果你是有一年工作年限的程式設計師,估計面試官就會聲討你了。假設,併發數10w+,它就將被蹂躪的不堪入目。那麼我們需要怎麼解決呢?加上同步操作就大功告成。

1

public

class

singletonclass

10return

instance;11}

12 }

問題:從效率維度考慮,估計這樣已經完美了吧?但是,從安全緯度考慮,依然隱隱約約存在問題。如果是接觸過反射、反序列化的同學,我們一起來繼續**。

/**

* 通過反射破壞懶漢式單例

問題:這麼輕易就被破解了?那怎麼解決呢?

public

class singletonclass implements

serializable

}public

static

synchronized

singletonclass getinstance()

return

instance;}//

當沒有定義這方法時,反序列化預設是重新new物件。

//反序列化時,如果定義了readresolve()則直接返回此方法指定的物件。而不需要單獨再建立新物件!

private object readresolve() throws

objectstreamexception

雙重檢查鎖與內部類的方式:緣由懶漢式、餓漢式要麼存在呼叫效率低或者執行效率低問題。而這兩種方式取前兩者的優點為自己所用。

1

/**2

* 單例模式-雙重檢查鎖3*

@author

aaron4*/

5public

class

singletonclass14}

15}16return

instance;17}

18 }

問題:緣由jvm對於此種方式的同步控制,並不穩定,當高併發的時候,可能會出現問題,並不推薦使用這種方式。理論上來說,它是不存在問題的。

1

/**2

* 單例模式-內部類的方式3*

@author

aaron4*/

5public

class

singletonclass

1011

public

static

singletonclass getinstance()

14 }

1

/**2

* 單例模式-列舉的方式3*

@author

aaron4*/

5public

enum

singletonclass

出處:

您的支援是對博主深入思考總結的最大鼓勵。

單例模式 層層剖析尋找最高效安全的單例

什麼是單例?它的運用場景是什麼?單例模式是指保證在系統中只存在某類唯一物件。運用場景隨處可見,例如工具類 spring容器預設new物件等。單例模式有幾種實現方式?餓漢式 懶漢式 雙重檢查鎖式 內部類式 列舉式。推薦使用方式?餓漢式 內部類式。餓漢式顧名思義餓,那麼當應用程式一開始類載入,類的物件立...

單例模式 層層剖析尋找最高效安全的單例

什麼是單例?它的運用場景是什麼?單例模式是指保證在系統中只存在某類唯一物件。運用場景隨處可見,例如工具類 spring容器預設new物件等。單例模式有幾種實現方式?餓漢式 懶漢式 雙重檢查鎖式 內部類式 列舉式。推薦使用方式?餓漢式 內部類式。餓漢式顧名思義餓,那麼當應用程式一開始類載入,類的物件立...

安全高效的單例

概述 單例設計模式,就是採取一定的方法保證在整個的軟體系統中,對某個類只能存在乙個物件例項,並且該類只提供乙個取得其物件例項的方法 靜態方法 單例適用於需要頻繁的進行建立和銷毀的物件 建立物件時耗時過多或耗費資源過多 即 重量級物件 但又經常用到的物件 工具類物件 頻繁訪問資料庫或檔案的物件 比如資...