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