synchronized底層實現原理
測試類:
public class SynchronizedTest { public void get() { synchronized (this) { System.out.println("小張你好鴨!"); } } }
字節碼文件(怎麼看?? idea => view => Show ByteCode
)
再來說原理:
基於對象的監視器(ObjectMonitor
),我們在字節碼文件裡面可以看到,在同步方法執行前後,有兩個指令,進入同步方法前monitorenter
,方法執行完成後monitorexit
;
我的理解是對象都有一個監視器ObjectMonitor
,這個監視器內部有很多屬性,比如當前等待線程數、計數器、當前所屬線程等;其中計數器屬性就是用來記錄是否已被線程占有,方法執行到monitorenter時,計數器+1,執行到monitorexit
時,計數器-1,線程就是通過這個計數器來判斷當前鎖對象是否已被占用(0為未占用,此時可以獲取鎖);
補充:一個synchronize
鎖會有兩個monitorexit
,這是保證synchronize
能一定釋放鎖的機制,一個是方法正常執行完釋放,一個是執行過程發生異常時虛擬機釋放;
到此這篇關於synchronized底層實現原理的文章就介紹到這瞭,更多相關synchronized底層內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 死磕 java同步系列之synchronized解析
- Java synchronized重量級鎖實現過程淺析
- Java並發之synchronized實現原理深入理解
- IDEA神器一鍵查看Java字節碼及其他類信息插件
- java多線程Synchronized實現可見性原理解析