取經之路
關鍵字synchronized
-
使每個線程依次排隊操作共享變量 <效率低,但是基礎>
-
原理
- 場景
- 方法
- 實例方法
synchronized void func()
- 靜態方法 (類方法)
static synchronized void func()
- 實例方法
- 代碼塊
- 實例對象
synchronized(this)
- 類對象
synchronized(ClassA.class)
- 具體對象``string lock = “”; synchronized(lock)`
- 實例對象
- 方法
**自我理解: **
靜態和實例的區別就是:
- 靜態屬於這個類的所有實例的方法都會被鎖
- 實例僅僅鎖住當前對象實例
- 場景
-
底層原理
-
監聽器
- 先獲取對象的監聽器monitor才能繼續執行
- 同一時刻只用一個線程可以獲得對象的監聽器monitor <互斥>
- 類對象的synchronized具有重入性,不需要再次獲得鎖
- 每個對象都有監聽器,只有獲得監聽器才能繼續操作,否則線程等待阻塞
-
A happens-before B
- A執行再B得前面
- A得結果對B可見 <B讀取到的數據使A的值>
-
獲取和釋放鎖的內存含義
-
獲取鎖
- 從主存中讀取數據到工作內存
-
釋放鎖
- 將工作內存中的最新之刷新到主存
自我理解
對象的監聽器和可見性
- synchronized優化
悲觀鎖 很是悲觀,一開始就認爲自己有衝突,獲取鎖的時候阻塞其他線程獲取鎖
樂觀鎖愛笑的人運氣不會差,一開始認位沒有衝突,不會阻塞其他線程的操作
-
CAS 比較交換
-
檢測線程是否出現衝突
-
VON操作
-
V 內存存放的實際值
-
O 舊的值
-
N 更新的值
操作
V ==O -> V=N
V!=O -> return V
-
-
缺點
- ABA問題
解決方案:AtomicStampedReference Java1.5之後引入
- 自旋時間過長
- 只能保證一個共享變量的原子操作
解決方案: 常量類
- ABA問題
-
-
Java對象頭
- 組成
- 鎖狀態
- 無狀態
- 偏向鎖
- 輕量鎖
- 重量鎖
- 對象hashcode
- 對象分代年齡
- 是否偏向鎖
- 鎖標記
- 鎖狀態
- 偏向鎖
- 使獲得鎖的代價減少 <通過檢查對象頭,避免CAS操作>
- 等到競爭出現的時候才釋放鎖
- 輕量鎖
- 執行代碼前再棧幀創建鎖記錄空間
- 可升級爲重量鎖 <鎖可以升級不能降級>
- 組成
筆記整理自網絡