單例模式 雙層檢驗鎖 volatile

2022-08-03 23:09:15 字數 899 閱讀 9422

package

com..utils.threads;

public

class

dl }

}return

instance;

}public

static

void

main(string args)

/*** 分析:

* 加volatile的必要性

* 原因在於指令重排的存在,加入volatile可以禁止指令重排

** 當某乙個執行緒執行到第一次檢測,讀取到的instance不為null時,instance的引用物件可能沒有完成初始化

* instance = new dl();分為以下三步完成(偽**)

** memory = allocate(); 1、初始化物件記憶體空間

* instance(memory); 2、初始化物件

* instance = memory; 3、設定instance指向例項好的物件,此時instance!=null

** 由於步驟2 3 不存在資料依賴關係,如果發生指令重排

* memory = allocate(); 1、初始化物件記憶體空間

* instance = memory; 3、設定instance指向例項好的物件,此時instance!=null,但是物件還沒有初始化完成

* instance(memory); 2、初始化物件

** 所以當一條執行緒訪問instance不為null時,由於instance例項未必已初始化完成,也就造成了執行緒安全問題

*/}

呼叫結果:

單例模式 雙層檢驗鎖

單例模式 雙重校驗鎖 懶漢模式 public class singleton 私有化構造方法 private static volatile singleton singleton null public static singleton getinstance return singleton p...

單例模式 懶漢式 餓漢式和雙層鎖模式

單例就是該類只能返回乙個例項。單例所具備的特點 1.私有化的建構函式 2.私有的靜態的全域性變數 3.公有的靜態的方法 單例分為懶漢式 餓漢式和雙層鎖式 懶漢式比較懶,只有當呼叫getinstance的時候,才回去初始化這個單例 author dym date 2020 12 20 16 07 pu...

java單例模式中的雙重檢驗鎖

public class doublecheck public static doublecheck getsingleton return instance 首先判斷instance是否為null,如果確實為null,則進入乙個synchronize包圍的 塊,相當於上了鎖,進入了臨界區,為了防止...