靜態內部類建立單例的實現和優點

2021-10-05 00:06:31 字數 940 閱讀 5137

public class singleton 

public static singleton getinstance()

static class singletonholder()

}

如上,就是靜態內部類建立單例。優點如下:

1. 僅在需要使用單例時呼叫getinstance進行單例的建立。

2. jvm虛擬機器保證了靜態內部類singletonholder的類初始化只執行一次,不需要我們手動保證併發的同步。

這裡,在給出乙個經典的不加volatile的doublecheck方式建立單例會存在的乙個隱患。

public class singleton 

public static singleton getinstance() }}

return singleton;

}}

以上這種寫法,如果給singleton加上volatile就不會有問題。

出現問題的根本原因是new singleton() 這一步,其實會有三條位元組碼指令。

1. 堆中建立物件

2. 初始化堆中物件

3. 將物件的位址賦值給變數。

在併發執行的時候,並行的執行緒是可以改變這3條指令的執行順序的。如此的話,就會出現一種場景:執行緒a和b。a中執行了1和3,b正好執行到第乙個判空。這樣會導致b得到了乙個未能執行完初始化的singleton,後續操作就不能得到正確初始化後的值,這樣就會在乙個錯誤的基礎上出現更多的錯誤。

為什麼加上volatile就會不會有問題了呢?因為volatile禁止了new singleton() 這個操作的指令重排序。

至於volatile如何實現禁止指令重排序的呢?編譯器在這個操作上加上記憶體屏障,多處理器處理的時候不會打亂指令的順序。這邊這個回答,如果理解不了,可以忽略掉。需要你對volatile有深一步的理解。

靜態內部類實現單例模式

new b.c b b new b b.c c b.new c public class singleton public synchronized static singleton getinstance return instance public static singleton getins...

單例模式 靜態內部類

靜態內部類是乙個很好的實現單例的方式 看 package cn.liz.syn public class staticinner 私有的靜態內部類 private static class inner 公共的 獲取例項的方法 public static staticinner getinstance...

單例模式 靜態內部類

1 2 單例模式 靜態內部類3 4public class singletontest0711 1213 14 靜態內部類實現方式 15 16class singleton 2324 25 2.寫乙個靜態內部類,直接返回singleton 26 27private static class sing...