你的單例模式真的是執行緒安全的嗎?
在我們平時的專案中,單例模式是十分常見的設計模式,當然我們使用最多的是"懶漢式":
public class SingleTon {
private static SingleTon instance = null;
private SingleTon(){
}
public static SingleTon getInstance(){
if(instance == null){ // 1
synchronized (SingleTon.class){
if(instance == null){
instance = new SingleTon(); // 2
}
}
}
return instance;
}
}
在初始化的時候我們使用雙重判斷的方式來確保只會被初始化一次,看上去很完美,但真的是這樣嗎?
答案是否定的,因為我們忽略了instance是否被初始化完畢.
我們先了解一下物件是如何在jvm中生成的,一共有三個步驟,
1.分配記憶體空間
2.初始化物件
3.設定instance指向剛分配的記憶體空間
因為第2步和第3步不存在資料依賴性,所以可能會被重排序。2和3重排序之後的執行順訊可能如下:
1.分配記憶體空間
2.設定instance指向剛分配的記憶體空間
3.初始化物件
假設程式是按照第二種情況的例項化順序,那麼當兩個執行緒同時執行該程式是,就有可能其中一個執行緒拿到了未初始化完成的物件,這樣對我們程式的執行效率影響是比較嚴重的.那該如何避免重排序呢?
答案是使用volatile關鍵字修飾instance,這樣就能避免jvm對我們的程式進行重排序,從而解決該問題的發生
public class SingleTon {
private volatile static SingleTon instance = null;
private SingleTon(){
}
public static SingleTon getInstance(){
if(instance == null){ // 1
synchronized (SingleTon.class){
if(instance == null){
instance = new SingleTon(); // 2
}
}
}
return instance;
}
}
相關文章
- 執行緒安全的單例模式執行緒單例模式
- C++ 執行緒安全的單例模式C++執行緒單例模式
- 【設計模式】你的單例模式真的是生產可用的嗎?設計模式單例
- 您的單例模式,真的單例嗎?單例模式
- 你真的會寫單例模式嗎?單例模式
- 設計模式之單例模式(執行緒安全)設計模式單例執行緒
- 單例模式——執行緒安全的兩種實現單例模式執行緒
- 靜態內部類實現的單例模式是執行緒安全的單例模式執行緒
- 單例模式執行緒安全reorder問題單例模式執行緒
- Java執行緒安全面試題,你真的瞭解嗎?Java執行緒面試題
- 【設計模式】實現執行緒安全單例模式的五種方式設計模式執行緒單例
- 面試官:你確定 Redis 是單執行緒的程式嗎?面試Redis執行緒
- 你真的會寫單例模式嗎——Java實現單例模式Java
- 如何看待Spring下單例模式與執行緒安全的矛盾Spring單例模式執行緒
- Java中執行緒池,你真的會用嗎?Java執行緒
- ConcurrentHashMap的size方法是執行緒安全的嗎?HashMap執行緒
- ios中的執行緒安全單例實現iOS執行緒單例
- C++ 靜態變數單例模式的誤會(執行緒安全)C++變數單例模式執行緒
- java多執行緒程式設計:你真的瞭解執行緒中斷嗎?Java執行緒程式設計
- JAVA_多執行緒_單例模式Java執行緒單例模式
- Qt 中用Q_GLOBAL_STATIC來實現執行緒安全的單例模式QT執行緒單例模式
- 【極客思考】設計模式:你確定你真的理解了單例模式嗎?設計模式單例
- 非同步與並行~List<T>是執行緒安全的嗎?非同步並行執行緒
- 24. 一個普通main方法的執行,是單執行緒模式還是多執行緒模式?為什麼?AI執行緒模式
- 單例模式(上)—如何優雅地保證執行緒安全問題單例模式執行緒
- 單例模式(上)---如何優雅地保證執行緒安全問題單例模式執行緒
- 單例模式中可能存在的一些問題(執行緒安全問題)單例模式執行緒
- 多執行緒下的單例執行緒單例
- 你知道Thread執行緒是如何運作的嗎?thread執行緒
- 你真的理解了java單例模式嗎?講別人都忽略的細節!Java單例模式
- 你的密碼真的安全嗎?密碼
- 單例模式(含執行緒鎖關鍵字)單例模式執行緒
- java設計模式之單例模式你真的會了嗎?(懶漢式篇)Java設計模式單例
- 設計模式之禪讀書筆記-單例模式你真的掌握了嗎?設計模式筆記單例
- 多執行緒,你覺得你安全了?(執行緒安全問題)執行緒
- ConcurrentHashMap執行緒安全嗎?HashMap執行緒
- 多執行緒安全的單例模式(使用判斷nullptr和call_once兩種方法)執行緒單例模式Null
- 面試官:Context攜帶資料是執行緒安全的嗎?面試Context執行緒