單例設計模式--懶漢模式
阿新 • • 發佈:2020-10-20
/**
* 懶漢模式
* 延遲載入,只有在真正使用的時候,才開始例項化。
* 執行緒安全
* double check 雙重檢查 加鎖優化
* 編譯器(JIT),CPU有可能對指令進行重排序,導致使用到尚未初始化的例項,可以通過新增volatile關鍵字進行修飾,
* 對於volatile修飾的欄位,可以防止指令重排
*/
public class LazySingleton {
//volatile--防止重排序
private volatile static LazySingleton instance;
private LazySingleton(){
}
//在進行多執行緒操作時,會出現建立兩個例項的情況,故加上(synchronized)鎖保證只有一個例項存在
public static LazySingleton getInstance(){//synchronized 考慮到效能損耗,如果加在方法上則表示不管例項有沒有初始化,都會加上鎖
if(instance == null){
//為空時,再進行加鎖。此時又會出現新的問題,當多個執行緒都到達這個地方後,第一個順利執行後,例項化過後,後面的所有執行緒都會又例項化一次
//多個執行緒在此位置進行訪問高併發還是會有一定的效能損耗
synchronized (LazySingleton.class){
//所以再加上一個條件
if(instance == null){
instance = new LazySingleton();
//位元組碼層面
//JIT CPU 可能對2.3.步驟進行重排序 造成空指標錯誤 如果解決? volatile--防止重排序
//1.分配空間
//2.初始化
//3.引用賦值
}
}
}
return instance;
}
}