天天看點

synchronized底層實作原理(保證看懂)

首先那些說看過synchronized源碼的基本都是大聰明,synchronized根本點不進去,想弄懂它的實作原理,我們隻能通過看編譯好的位元組碼檔案

整個測試類

public class SynchronizedTest {
    public void get() {
        synchronized (this) {
            System.out.println("小張你好鴨!");
        }
    }
}      

位元組碼檔案(怎麼看?? idea => view => Show ByteCode)

synchronized底層實作原理(保證看懂)

再來說原理:

基于對象的螢幕(ObjectMonitor),我們在位元組碼檔案裡面可以看到,在同步方法執行前後,有兩個指令,進入同步方法前monitorenter,方法執行完成後monitorexit;

我的了解是對象都有一個螢幕ObjectMonitor,這個螢幕内部有很多屬性,比如目前等待線程數、計數器、目前所屬線程等;其中計數器屬性就是用來記錄是否已被線程占有,方法執行到monitorenter時,計數器+1,執行到monitorexit時,計數器-1,線程就是通過這個計數器來判斷目前鎖對象是否已被占用(0為未占用,此時可以擷取鎖);

補充:一個synchronize鎖會有兩個monitorexit,這是保證synchronize能一定釋放鎖的機制,一個是方法正常執行完釋放,一個是執行過程發生異常時虛拟機釋放;

繼續閱讀