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...