單例模式的雙重校驗鎖模式 的知識點 解讀

2022-08-20 20:00:14 字數 1552 閱讀 7748

public class singleton 

public singleton getinstance() }}

return uniquesingleton;}}

1 單例模式 何時懶漢 何時餓漢

懶漢 延遲載入 一些很耗資源的(時間 io cpu 記憶體)操作 可以用到時 載入 初始化

餓漢 簡單的實現 可以保證執行緒安全的單例

2 去掉 volatile 怎樣

a a=new a();

一行** 其實翻譯成機器碼(可以理解成 彙編碼)其實是多個指令

至少兩步

一 分配記憶體 初始化

二 記憶體位址和引用 關聯 (棧 存 引用;堆 存 例項化的物件)

這兩步其實 是無序的

如果 第乙個執行緒 進去 第乙個判空 為空 去new 但是 先走了第二步 停下 此時 第二個執行緒 進去 就會 直接

return uniquesingleton; 乙個未初始化完成的物件 去用可能就會有問題 比如 裡面有物件 啥的 空指標
//volatile vs synchronized

volatile 保證多執行緒下 可見性 有序性 但不保證原子性
jdk 一直在對鎖優化 所以 volatile 不一定比 synchronized 快多少 但是多少會快  

首先 實現的機制不一樣 synchronized 基於 鎖的互斥 而且 volatile 沒保證原子性 多少會快

// 擴充套件 : 什麼時候用 volatile

不存在原子性 或者 不需要保證原子性

比如 一寫多讀

注意 jdk 1.5 及之後 才保證有序

3 synchronized  參考:

乙個物件只有一把鎖,乙個執行緒獲取了該物件的鎖之後,其他執行緒無法獲取該物件的鎖,就不能訪問該物件的其他synchronized例項方法,但是可以訪問非synchronized修飾的方法(待驗證)

修飾**塊 相對修飾方法的好處 修飾**塊 鎖的東西更少 效率相對較高
修飾非static方法和修飾**塊 一樣 其實鎖的也是物件

**塊鎖物件的三種方式(待驗證 : a類中的**塊 怎麼去鎖b物件 b類)

class a

}

synchronized(this)③(待研究 鎖的是 物件 還是類)

synchronized(a.class)

4 為啥不直接synchronized 修飾方法

慢 因為只有第一次才需要鎖

後面new 後 不需要鎖 直接return

單例模式 雙重校驗鎖

單例模式 雙重校驗鎖 author szekinwin public class singleton3 私有化構造方法 private static volatile singleton3 singleton null public static singleton3 getinstance ret...

單例模式中的雙重校驗鎖

單執行緒的時候 class foo return helper 這段在使用多執行緒的情況下無法正常工作。在多個執行緒同時呼叫gethelper 時,必須要獲取鎖,否則,這些執行緒可能同時去建立物件,或者某個執行緒會得到乙個未完全初始化的物件。鎖可以通過代價很高的同步來獲得,就像下面的例子一樣。這樣寫...

雙重校驗鎖實現單例模式

1 先上 public class singleton public static singleton getinstance return instance 2 分析 第一次校驗 instance null 單例模式只需要建立乙個例項,假如例項不為空則不需要去競爭鎖,提高效能 第二次校驗 inst...