透過字節碼理解synchronized關鍵字

我們知道synchronied是java排它鎖的一種實現,支持可重入性,基於此我們可以實現多線程的一個同步。synchronied是怎麼實現的呢?其實synchronied關鍵字是基於對象的監視器即Monitor對象實現同步。一次只有一個線程可以鎖定監視器,試圖鎖定該監視器的任何其它線程都會被阻塞,知道他們可以獲取該監視器上的鎖定爲之。

  • 同步代碼塊採用monitorenter、monitorexit指令實現。

看下面的一個簡單的例子

每天分享一個知識點,透過字節碼理解synchronized關鍵字

然後執行javap -v TestSynchronized.class進行反編譯,編譯結果如下:

每天分享一個知識點,透過字節碼理解synchronized關鍵字

由上面反編譯生成的字節碼指定我們可以知道,當我們使用synchronied關鍵字來修飾代碼塊的時候,字節碼的層面是通過monitorenter和monitorexit指令來實現鎖的獲取和釋放。當線程進入到monitorenter指定時,線程將會持有Monitor對象,退出monitorexit指定時,線程將會釋放Monitor對象。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章