亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從方法返回的同步代碼中的對象

從方法返回的同步代碼中的對象

慕碼人8056858 2023-09-27 17:02:28
我想要一個同步塊,其中要同步的對象是從方法調用返回的:...synchronized( someGetMethod() ) {// synchronized block}...是否假設“someGetMethod”是同步的或僅“//同步塊”部分?先感謝您編輯:我有一個集合(要鎖定的對象的映射)。“someGetMethod”檢查地圖上是否存在對象,如果不存在,它將添加該對象并返回它以便鎖定。從下面的答案中,我了解到“someGetMethod”可以返回Map上已有的值,但在進入同步塊之前,切換到另一個線程,這可能會刪除上述值。因此,另一個線程可能通過“someGetMethod”進行相同的檢查,現在得到不同的結果。所以看來我應該從同步塊中進行刪除,是否有更好的選擇?
查看完整描述

2 回答

?
POPMUISE

TA貢獻1765條經驗 獲得超5個贊

這:


synchronized( someGetMethod() ) {

// synchronized block

}

是相同的


Object obj = someGetMethod();

synchronized( obj ) {

// synchronized block

}

所以不,someGetMethod()不是以同步方式調用。


如果你想讓它同步,你要么必須聲明方法synchronized,要么顯式同步,例如:


synchronized (this) {

  synchronized( someGetMethod() ) {

    // synchronized block

  }

}


查看完整回答
反對 回復 2023-09-27
?
守著星空守著你

TA貢獻1799條經驗 獲得超8個贊

someGetMethod()是在線程鎖定與表達式結果關聯的監視器之前計算的表達式。

14.19。同步語句

同步語句是通過首先評估表達式來執行的。然后:

  • 如果表達式的求值由于某種原因突然完成,那么同步語句也會因為同樣的原因突然完成。

  • 否則,如果 Expression 的值為 null,則拋出 NullPointerException。

  • 否則,設Expression的非空值為V。執行線程鎖定與V關聯的監視器。然后執行該Block,然后有一個選擇:

    • 如果塊的執行正常完成,則監視器被解鎖并且同步語句正常完成。

    • 如果該塊的執行由于任何原因突然完成,則監視器將被解鎖并且同步語句由于相同原因突然完成。

您無法輸入同步塊,計算表達式,然后查看與結果關聯的監視器。你是如何進入這個塊而不首先評估它的表達式的?你用什么顯示器someGetMethod()來同步自己?


查看完整回答
反對 回復 2023-09-27
  • 2 回答
  • 0 關注
  • 118 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號