2 回答

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

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