首先那些說看過synchronized原始碼的基本都是大聰明,synchronized根本點不進去,想弄懂它的實現原理,我們只能通過看編譯好的位元組碼檔案
整個測試類
public
class
synchronizedtest
}}
位元組碼檔案(怎麼看?? idea => view => show bytecode)
再來說原理:
基於物件的監視器(objectmonitor),我們在位元組碼檔案裡面可以看到,在同步方法執行前後,有兩個指令,進入同步方法前monitorenter,方法執行完成後monitorexit;
我的理解是物件都有乙個監視器objectmonitor,這個監視器內部有很多屬性,比如當前等待執行緒數、計數器、當前所屬執行緒等;其中計數器屬性就是用來記錄是否已被執行緒占有,方法執行到monitorenter時,計數器+1,執行到monitorexit時,計數器-1,執行緒就是通過這個計數器來判斷當前鎖物件是否已被占用(0為未占用,此時可以獲取鎖);
補充:乙個synchronize鎖會有兩個monitorexit,這是保證synchronize能一定釋放鎖的機制,乙個是方法正常執行完釋放,乙個是執行過程發生異常時虛擬機器釋放;
synchronized底層原理學習
這個是以sychronized修飾物件進行分析,假設使用了a物件進行加鎖,那麼a物件就是鎖,a物件包含有物件頭 資料和填充組成,其中物件頭包含mark word和型別指標,mark word會指向乙個監視器物件 指向監視器的引用 監視器物件包含有執行緒持有者和計數器等資訊。mark word包括有物...
ConcurrentHashMap底層實現
concurrenthashmap融合了hashtable和hashmap二者的優勢 hashtable是做了同步的,hashmap沒有同步,所以hashmap在單執行緒情況下效率高,hashtable在多執行緒情況下,同步操作能保證程式執行的正確性 但是hashtable每次同步執行都要鎖住整個結...
synchronized底層實現原理及鎖優化
一 概述 1 synchronized作用 原子性 synchronized保證語句塊內操作是原子的 可見性 synchronized保證可見性 通過 在執行unlock之前,必須先把此變數同步回主記憶體 實現 有序性 synchronized保證有序性 通過 乙個變數在同一時刻只允許一條執行緒對其...