講一下 synchronized 關鍵字的底層原理

synchronized 關鍵字底層原理屬於 JVM 層面。

① synchronized 同步語句塊的情況

講一下 synchronized 關鍵字的底層原理

通過 JDK 自帶的 javap 命令查看 SynchronizedDemo 類的相關字節碼信息:首先切換到類的對應目錄執行 javac

SynchronizedDemo.java 命令生成編譯後的 .class 文件,然後執行 javap -c -s -v -l

SynchronizedDemo.class 。

講一下 synchronized 關鍵字的底層原理

從上面我們可以看出:

synchronized 同步語句塊的實現使用的是 monitorenter 和 monitorexit 指令,其中 monitorenter 指令指向同步代碼塊的開始位置,monitorexit 指令則指明同步代碼塊的結束位置。 當執行 monitorenter 指令時,線程試圖獲取鎖也就是獲取 monitor(monitor對象存在於每個Java對象的對象頭中,synchronized 鎖便是通過這種方式獲取鎖的,也是為什麼Java中任意對象可以作為鎖的原因) 的持有權.當計數器為0則可以成功獲取,獲取後將鎖計數器設為1也就是加1。相應的在執行 monitorexit 指令後,將鎖計數器設為0,表明鎖被釋放。如果獲取對象鎖失敗,那當前線程就要阻塞等待,直到鎖被另外一個線程釋放為止。

② synchronized 修飾方法的的情況

講一下 synchronized 關鍵字的底層原理

講一下 synchronized 關鍵字的底層原理

synchronized 修飾的方法並沒有 monitorenter 指令和 monitorexit 指令,取得代之的確實是ACC_SYNCHRONIZED 標識,該標識指明瞭該方法是一個同步方法,JVM 通過該 ACC_SYNCHRONIZED 訪問標誌來辨別一個方法是否聲明為同步方法,從而執行相應的同步調用。

講到最後,給粉絲們送一波福利,關注並轉發文章後,私信找我要資料,回覆“Java面試”

講一下 synchronized 關鍵字的底層原理

講一下 synchronized 關鍵字的底層原理

講一下 synchronized 關鍵字的底層原理

講一下 synchronized 關鍵字的底層原理

講一下 synchronized 關鍵字的底層原理

講一下 synchronized 關鍵字的底層原理

講一下 synchronized 關鍵字的底層原理


分享到:


相關文章: