設計模式 單例模式的寫法

2022-06-19 06:33:09 字數 1884 閱讀 3592

目錄第三種實現方式(執行緒安全),雙重檢查+加鎖

3、靜態內部類實現單例模式

4、列舉

5、參考鏈結

單例模式的特點就是建構函式私有化,變數私有化,然後定義乙個public的方法。

class singleton

public static singleton getinstance()

}

第一種實現方法(執行緒不安全)

這種實現方式存在乙個問題,就是多執行緒併發的時候,可能會建立多個單例物件。比如兩個執行緒同時執行到if(instance==null),均判斷為true,然後這兩個執行緒都會去建立乙個singleton物件。

class singleton

public static singleton getinstance()

}

第二種實現方法(執行緒安全)

getinstance()方法上加上了synchronized關鍵字,可以保證執行緒安全。

class singleton

public static synchronized singleton getinstance()

}

第二種實現放方法存在乙個效率問題,就是每乙個獲取instance物件的時候都需要互斥的訪問,這導致併發的效能很差。實際上,我們只需要在第一次建立instance物件的時候互斥,之後每次讀的時候不需要互斥。這樣的話,就進化出下面的這種寫法。

class singleton

public static singleton getinstance()

}return instance;

}}

注意這個volatile關鍵字的使用,之所以加上這個是因為synchronized能保證原子性和可見性,但是禁止不了指令重排。volatile關鍵字可以禁止指令重排。之所以要加上volatile關鍵字,我們想象這樣乙個場景:執行緒a執行到instance=new singleton();這個指令可以分解為三個步驟(a)分配記憶體 (b)初始化記憶體物件(c)將instance指向那塊記憶體。編譯器做優化,可能會打亂b和c的步驟,比如說a-c-b。當執行緒a執行到(b)的時候,執行緒b執行if(instance==null)判斷出instance不為空,直接跳到最後一步return instance,則執行緒b會使用乙個尚未初始化的instance物件,可能會出錯。所以這塊要加上volatile關鍵字禁止指令重排。

class singleton

private static class holder

public static final singleton getinstance()

}

靜態內部類結合了懶漢式和餓漢式的優點,同時避免了懶漢式的執行緒不安全,和餓漢式的提前建立物件。

上面幾種實現單例模式的方法都存在乙個問題,就是利用反射機制可以輕而易舉的獲取到singleton類的私有構造方法,從而建立出物件。另外,也可以利用序列化和反序列化機制創造出另外新的物件。為了解決這個問題,使用列舉。列舉是最優美的實現單例模式的方法。

enum singleton

}

如果在列舉中想要定義一些變數,這樣寫

enum singleton

public singleton getinstance()

}

單例模式的優缺點和使用場景

單例模式的雙重鎖為什麼要加volatile

為什麼要用列舉實現單例模式(避免反射、序列化問題)

設計模式 單例模式的幾種寫法

一 單例模式 單例模式是一種建立型的模式,指某個類採用單例模式後,在這個類被建立後,只產生乙個例項以供外部訪問,且提供乙個全域性的訪問點。單例模式在開發中具有相當大的重要性,並且 實現相對簡潔。所以其是為數不多的在面試中會被問到且要求手擼 的設計模式哦 二 幾種單例的寫法及比較 1.飽漢模式 pac...

單例模式寫法

單例模式是最常用到的設計模式之一,熟悉設計模式的朋友對單例模式都不會陌生。一般介紹單例模式的書籍都會提到餓漢式和懶漢式這兩種實現方式。但是除了這兩種方式,本文還會介紹其他幾種實現單例的方式,讓我們來一起看看吧。單例模式是一種常用的軟體設計模式,其定義是單例物件的類只能允許乙個例項存在。許多時候整個系...

設計模式之單例模式的幾種寫法

經過了前面幾次的面試,我發現面試官對設計模式方面的提問頻率是非常高的,所以學習設計模式是一件刻不容緩的事情,今天我們就來說一下設計模式中的單例模式吧。設計模式並不是什麼神技,而是一套 的設計,是經驗的總結,使用設計模式是為了實現 的復用以及 解耦 關於程式設計裡面解耦的概念可以參考一下下面這篇知乎。...