你的單例模式真的是執行緒安全的嗎?
在我們平時的專案中,單例模式是十分常見的設計模式,當然我們使用最多的是"懶漢式":
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;
}
}
相關文章
- 【設計模式】你的單例模式真的是生產可用的嗎?設計模式單例
- 您的單例模式,真的單例嗎?單例模式
- 靜態內部類實現的單例模式是執行緒安全的單例模式執行緒
- 單例模式執行緒安全reorder問題單例模式執行緒
- 如何看待Spring下單例模式與執行緒安全的矛盾Spring單例模式執行緒
- 【設計模式】實現執行緒安全單例模式的五種方式設計模式執行緒單例
- Java執行緒安全面試題,你真的瞭解嗎?Java執行緒面試題
- ConcurrentHashMap的size方法是執行緒安全的嗎?HashMap執行緒
- 你真的會寫單例模式嗎——Java實現單例模式Java
- 面試官:你確定 Redis 是單執行緒的程式嗎?面試Redis執行緒
- Java中執行緒池,你真的會用嗎?Java執行緒
- Qt 中用Q_GLOBAL_STATIC來實現執行緒安全的單例模式QT執行緒單例模式
- java多執行緒程式設計:你真的瞭解執行緒中斷嗎?Java執行緒程式設計
- 單例模式中可能存在的一些問題(執行緒安全問題)單例模式執行緒
- 單例模式(上)—如何優雅地保證執行緒安全問題單例模式執行緒
- 單例模式(上)---如何優雅地保證執行緒安全問題單例模式執行緒
- 24. 一個普通main方法的執行,是單執行緒模式還是多執行緒模式?為什麼?AI執行緒模式
- 【極客思考】設計模式:你確定你真的理解了單例模式嗎?設計模式單例
- python 執行緒安全的 單例 實現 日誌分級Python執行緒單例
- 你真的理解了java單例模式嗎?講別人都忽略的細節!Java單例模式
- ConcurrentHashMap執行緒安全嗎?HashMap執行緒
- 多執行緒安全的單例模式(使用判斷nullptr和call_once兩種方法)執行緒單例模式Null
- synchronized 同步執行緒 單例設計模式+double checkingsynchronized執行緒單例設計模式
- java設計模式之單例模式你真的會了嗎?(懶漢式篇)Java設計模式單例
- 靜態變數在多執行緒環境下的初始化是執行緒安全的嗎?變數執行緒
- 多執行緒,你覺得你安全了?(執行緒安全問題)執行緒
- 小夥子,你懂執行緒池的建立嗎?執行緒
- 你瞭解單例模式的最佳實踐嗎?單例模式
- 面試官:Context攜帶資料是執行緒安全的嗎?面試Context執行緒
- 什麼是執行緒安全和執行緒不安全執行緒
- 單執行緒的js是如何工作的執行緒JS
- 執行緒的生命週期,真的沒那麼簡單執行緒
- 不使用synchronized和lock,如何實現一個執行緒安全的單例?synchronized執行緒單例
- Java多執行緒程式設計筆記10:單例模式Java執行緒程式設計筆記單例模式
- 單例模式的七種寫法,你都知道嗎?單例模式
- 【Java多執行緒】執行緒安全的集合Java執行緒
- RabbitMQ的佇列模式你真的懂嗎MQ佇列模式
- c++ 運算子過載、執行緒安全實現單例C++執行緒單例