synchronized 加在方法和代碼塊底層實現區別


1、同步方法塊

被括起來的塊分別有指令:monitorenter 和 monitorexit

monitorenter:

從之前的筆記知道,每個對象都有一個監視器鎖(monitor),當monitor被占用時就會處於鎖定狀態。線程就是執行monitorenter命令獲取monitor鎖的。

  1、如果monitor的進入數為0,則線程獲取鎖,並設置monitor的進入數為1

  2、如果該線程已經占有該monitor,則進入數+1

  3、如果其他線程占有該monitor,則monitor的進入數不為0,則該線程進入阻塞狀態,直到monitor為0,重新獲取monitor的所有權

 

monitorexit:

執行monitorexit的線程必須是monitor的所有者。

當執行該命令時,monitor的進入數-1,當monitor的進入數為0,該線程已經不再是該monitor的所有者,其他被這個monitor阻塞的線程可以嘗試獲取monitor的所有權。

 

2、同步方法

方法中會有個ACC_SYNCHRONIZED標志,調用方法時會檢查這個標志,如果被設置了,執行線程先獲取monitor,再執行方法代碼,再釋放monitor,同一個monitor在同一個時刻只能由一個線程所有。

 

總結:

一個加標志位,一個加監控

 

 

參考:

https://blog.csdn.net/ychenfeng/article/details/77427554

https://blog.csdn.net/cs408/article/details/48930803


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM