2 回答

TA貢獻1765條經驗 獲得超5個贊
這:
synchronized( someGetMethod() ) {
// synchronized block
}
是相同的
Object obj = someGetMethod();
synchronized( obj ) {
// synchronized block
}
所以不,someGetMethod()不是以同步方式調用。
如果你想讓它同步,你要么必須聲明方法synchronized,要么顯式同步,例如:
synchronized (this) {
synchronized( someGetMethod() ) {
// synchronized block
}
}

TA貢獻1799條經驗 獲得超8個贊
someGetMethod()
是在線程鎖定與表達式結果關聯的監視器之前計算的表達式。
14.19。同步語句
同步語句是通過首先評估表達式來執行的。然后:
如果表達式的求值由于某種原因突然完成,那么同步語句也會因為同樣的原因突然完成。
否則,如果 Expression 的值為 null,則拋出 NullPointerException。
否則,設Expression的非空值為V。執行線程鎖定與V關聯的監視器。然后執行該Block,然后有一個選擇:
如果塊的執行正常完成,則監視器被解鎖并且同步語句正常完成。
如果該塊的執行由于任何原因突然完成,則監視器將被解鎖并且同步語句由于相同原因突然完成。
您無法輸入同步塊,計算表達式,然后查看與結果關聯的監視器。你是如何進入這個塊而不首先評估它的表達式的?你用什么顯示器someGetMethod()
來同步自己?
添加回答
舉報