當前位置:編程學習大全網 - 源碼下載 - 設計模式的單例模式

設計模式的單例模式

本文開始對整個設計模式進行壹系列的研究,希望通過不斷的學習,能夠從整體上掌握設計模式,並根據實際情況在項目中使用。

單例模式意味著壹個類只允許創建自己的壹個實例,並提供對該實例的訪問。它包含靜態變量,可以保存自己唯壹的私有實例。它適用於這個場景——用戶希望將壹個類的實例約束到壹個對象。當需要壹個單獨的對象來協調整個系統時,這是很有幫助的。

1,singleton類只能有壹個實例。

2.singleton類必須創建自己唯壹的實例。

3.singleton類必須向所有其他對象提供這個實例。

1.盡量用懶人加載。

2.實現線程安全的雙重檢索

3.構造方法是私有的

4.定義靜態Singleton實例對象和getInstance()方法。

至少有六種方法可以編寫單例模式。

作為壹種重要的設計模式,singleton模式具有以下優點:

1.控制資源的使用,通過線程同步控制資源的並發訪問。

2、控制實例的生成,以達到節約資源的目的。

3.控制數據的共享,在不建立直接關聯的情況下,實現多個無關進程或線程之間的通信。

Singleton通過將構造函數限制為private來防止類被外部實例化。在同壹個虛擬機內,Singleton的唯壹實例只能通過getInstance()方法訪問。但實際上是可以通過Java反射機制實例化壹個方法是私有的類,這基本上會使所有的Java singleton實現失效。

雖然只能有壹個線程執行,但是如果線程B先執行,線程B獲得鎖,線程B執行後線程A獲得鎖,但是此時不檢查singleton是否為空就直接執行,所以會出現singleton的兩個實例。

既然懶惰風格是線程安全的,我們應該改進它。最直接的想法是,鎖定getInstance方法是好的,但是我們不需要鎖定所有的方法,只需要鎖定其中的壹部分。基於這種考慮,介紹了雙重檢查鎖(DCL)的寫入方法:

使用volatile的原因:

對於JVM,它逐個執行Java指令。Java指令中創建對象和賦值是分開進行的,也就是說instance = new Singleton();該語句分兩步執行。但是JVM並不保證這兩個操作的順序,也就是說有可能JVM會為新的Singleton實例分配空間,然後直接分配給實例成員,然後初始化Singleton實例。這使得犯錯誤成為可能。讓我們仍然以兩個線程A和B為例:

當壹個類被加載時,它的內部類不會同時被加載。當且僅當類的壹個靜態成員(靜態字段、構造函數、靜態方法等)被加載時,類才被加載。)叫做。

枚舉類實現singleton模式是有效的java作者強烈推薦的壹種singleton實現模式,因為枚舉類型是線程安全的,並且只會被加載壹次。設計者充分利用了枚舉的這個特性來實現singleton模式,而且枚舉的編寫非常簡單,枚舉類型是唯壹不會被破壞的singleton實現模式。因為枚舉類沒有構造函數,所以它可以防止反序列化。

1.除了枚舉之外,其他所有方法都會通過反射來銷毀單例。反射通過調用構造函數生成新的對象,所以如果我們想防止單例被破壞,可以在構造函數中進行判斷。如果存在現有的實例,我們將阻止生成新的實例。解決方案如下:

2.如果singleton類實現了序列化接口Serializable,就可以通過反序列化來破壞singleton,這樣我們就不用實現序列化接口了。如果必須實現序列化接口,可以重寫反序列化方法readResolve()並在反序列化時直接返回相關的singleton對象。

運行時就是壹個典型的例子。看看JDK API對這個類的解釋。“每個Java應用都有壹個Runtime類的實例,使應用能夠與其運行環境連接,當前的運行時可以通過getRuntime方法獲得。應用程序不能創建自己的運行時類實例。這篇文章中有兩個要點:

1.每個應用程序都有壹個運行時類的實例。

2.應用程序不能創建自己的運行時類實例。

只有壹個,不能自己創造。是典型的單例模式嗎?看壹看,運行時類是這樣寫的:

為了節省系統資源,有時有必要確保系統中只有壹個類實例。當這個唯壹的實例創建成功後,我們就不能再創建同類型的另壹個對象,所有的操作都只能基於這個唯壹的實例。為了保證對象的唯壹性,我們可以通過singleton模式來實現。

單壹模式應用程序場景通常在以下情況下出現:

(1)資源共享時,應避免資源操作造成的性能或損失。應用上面日誌文件中的配置。

(2)在控制資源的情況下,便於相互溝通。比如線程池。

獨生子女模式漫畫解析:/s/f-sjizhr 7 jua 31 gktlllsfq

singleton模式的優缺點、註意事項和使用場景。

  • 上一篇:深入理解React16之:(壹).Fiber架構
  • 下一篇:脗鉚擄擄脡陸脰脦脥脩路壟戮漏驢脝魯枚脙沒
  • copyright 2024編程學習大全網