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在同一個時刻只能由一個線程所有。
總結:
一個加標志位,一個加監控
參考: