單例模式的雙重檢查

2021-09-22 21:25:19 字數 698 閱讀 7194

單例模式**

public class singleton

public static singleton getinstance()

}} return uniqueinstance;

}}

其中有兩次判斷是否為空的語句,第一次是為了提高效率,避免每次都要執行同步**塊,第二次判空,是為了避免多執行緒帶來的不安全,當兩個執行緒同時對第乙個判斷為空時,均會先後進入同步**塊,此時,若沒有第二個判空條件,則會引來建立多個例項。

uniqueinstance採用volatile關鍵字修飾很有必要

uniqueinstance = new singleton();
這句**事實上是分三步:

為uniqueinstance分配記憶體空間

初始化uniqueinstance

將uniqueinstance指向分配的記憶體位址

但是,jvm會有指令重排的特性,執行順序有可能改變,不是按照123的順序,可能是132,這樣就會導致乙個執行緒獲得沒有初始化的例項

如:t1執行了13,此時t2呼叫了getinstance()後發現uniqueinstance已經不為空了,因此返回uniqueinstance,但是這時uniqueinstance還沒有被初始化

volatile就可以禁止jvm的指令重排,保證在多執行緒環境下也能正常執行

單例模式之雙重檢查

在實現單例模式時,如果未考慮多執行緒的情況,就容易寫出下面的錯誤 public class singleton public singleton getinstance return uniquesingleton 在多執行緒的情況下,這樣寫可能會導致uniquesingleton有多個例項。比如下...

單例模式 雙重檢查鎖

單例模式分為餓漢式和懶漢式。餓漢式是事先分配記憶體,提前建立。這樣的方式為到位占用資源,當這種比較多時,會占用很多記憶體。懶漢式是在被呼叫的時候進行。這種在併發時又會導致問題。比較穩妥的辦法是在懶漢式的基礎上加上鎖,然後進行雙重檢查,這種springioc容器式單例也是用這種雙重檢查來避免執行緒衝突...

單例模式中的 雙重檢查鎖定

created with intellij idea.date 14 9 2 time 下午10 09 to change this template use file settings file templates.public class singledemo public static sin...