java手把手教你寫6種單例模式(面試手寫代碼環節,別發懵)

在java中,單例有很多種寫法,面試時,手寫代碼環節,除了寫算法題,有時候也會讓手寫單例模式,這裡記錄一下單例的幾種寫法和優缺點。

  • 1.初級寫法
  • 2.加鎖
  • 3.餓漢式
  • 4.懶漢式
  • 5.雙鎖檢驗
  • 6.內部類

1.初級寫法

java手把手教你寫6種單例模式(面試手寫代碼環節,別發懵)

上面這種寫法,在併發環境下,會出現多個實例。

2.加鎖

我們優化上面的代碼,遇到併發,很容易想到加鎖,把獲取對象的方法加上關鍵字synchronized,很巧,這種寫法也稱為懶漢式單例 ,如下:

java手把手教你寫6種單例模式(面試手寫代碼環節,別發懵)

但是,顯然,我們把整個方法都同步了,效率很低下,我們可以繼續優化,只在創建實例的地方加上同步,參考5雙鎖檢驗。

3.餓漢式

餓漢式的特點是:類在加載時就直接初始化了實例。即使沒用到,也會實例化。

java手把手教你寫6種單例模式(面試手寫代碼環節,別發懵)

4.懶漢式

懶漢式的特點是:用到這個實例時才去調用方法實例化。這個和2中的看起來是一樣的,因為這個實例化方法加了synchronized ,這樣安全一些。

java手把手教你寫6種單例模式(面試手寫代碼環節,別發懵)

5.雙鎖檢驗

雙重非空判斷,new對象前加一次鎖。

volatile關鍵字,考慮的是,new關鍵字在虛擬機中執行時其實分為很多步驟,具體原因可以參考深入理解java虛擬機一書(考慮的是這個new關鍵字字節碼執行時是非原子性的),而volatile關鍵字可以防止指令重排。

java手把手教你寫6種單例模式(面試手寫代碼環節,別發懵)

6.內部類

java手把手教你寫6種單例模式(面試手寫代碼環節,別發懵)


分享到:


相關文章: