懶漢式–第一次呼叫時載入
1. 第一版 上來沒有想很多,直接敲起,使用synchronized保證執行緒安全,**如下:
public class single;
//使用synchronized保證安全
public static synchronized single getsingle()
return instance;
}}
2.第一版的缺點:當兩個執行緒 同時訪問執行緒鎖的時候,出現競爭,乙個獲得鎖,乙個等待,等第乙個執行緒執行完之後,第二個執行緒才能獲得鎖,執行判斷條件.這樣效率會很低.
看了一篇部落格後發現,可以使用雙重判斷進行優化,改進版如下:
public class single2 ;
private single2 getsingle() }}
return instance;
}}
3.部落格中提到的完美版本:volatile關鍵字版
解決上面版本中可能出現的指令重排導致不穩定結果的出現:
1.給instance分配記憶體
2.呼叫建構函式初始化成員變數,建立例項
3.將instance指向分配的記憶體空間//注意是指向記憶體空間,不是例項
在jvm中可能會出現指令重排問題而導致步驟2和3的順序不能保證,當執行緒1如果在執行完指令1後直接執行指向3,如果在其執行完3而未執行2時,執行緒2開始訪問第一層if判斷,注意這時的instance就已經不是null了,它已經指向了jvm分配的記憶體空間,這樣執行緒2就會直接返回中間態instance,繼續執行下去將會報錯.
解決方法使用volatile關鍵字修飾instance,volatile會產生記憶體屏障,從而禁止指令重排
public class single3 ;
private single3 getsingle() }}
return instance;
}}
2.餓漢式 –在類裝載時建立例項
這種情況下例項在類載入器載入類初始化,這時jvm會保證執行緒同步
public class single4;
public static single4 gesingle()
}
劍指offer 2 單例模式
實現乙個單例模式 實現單例模式的關鍵在於 將建構函式設定為private,或是protected 建立乙個靜態函式,呼叫建構函式。使用乙個靜態成員變數儲存單例物件 因為只能在堆上分配記憶體,因此需要乙個函式顯式的呼叫析構函式 class singleton return obj singleton ...
劍指offer 單例模式
單例模式分為懶漢式和餓漢式。所謂單例模式,就是構造器私有化,對外界提供唯一的乙份例項。public class test class person 構造器私有化 public static person getinstance return p public class test class per...
《劍指offer》系列 單例模式
永遠年輕,永遠熱淚盈眶。寫乙個單例模式 單例模式有多種寫法,以下整理了六種寫法,你都學會了嗎?public class test01 public singleton1 getinstance 懶漢式 非執行緒安全的 public static class singleton2 public sin...