簡體   English   中英

從方法返回的同步代碼中的 Object

[英]Object in Synchronized code returned from a method

我想要一個同步塊,其中從方法調用返回要同步的 Object:

...
synchronized( someGetMethod() ) {
// synchronized block
}
...

是否假設“someGetMethod”已同步或僅“//同步塊”部分?

先感謝您

編輯:我有一個集合(要鎖定的對象映射)。 “someGetMethod”檢查 Map 上是否存在 object,如果沒有,它將添加並返回它以鎖定。 從下面的答案中,我了解到“someGetMethod”可以返回 Map 上已經存在的值,但在進入同步塊之前,切換到另一個線程,這可能會刪除上述值。 結果,另一個線程可能通過“someGetMethod”進行相同的檢查,現在得到不同的結果。所以看來我應該從同步塊中刪除,有更好的選擇嗎?

Edit2:謝謝大家的幫助。 我發現了一個類似的問題 - Java 同步塊使用方法調用來獲取同步 object

這個:

synchronized( someGetMethod() ) {
// synchronized block
}

是相同的

Object obj = someGetMethod();
synchronized( obj ) {
// synchronized block
}

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

如果你希望它被同步,你要么必須聲明方法同步,要么顯式同步,例如:

synchronized (this) {
  synchronized( someGetMethod() ) {
    // synchronized block
  }
}

someGetMethod()是一個表達式,它在與表達式的結果相關聯的監視器被線程鎖定之前進行評估。

14.19。 同步聲明

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

  • 如果 Expression 的評估由於某種原因突然完成,則同步語句由於相同的原因而突然完成。

  • 否則,如果 Expression 的值為 null,則會引發 NullPointerException。

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

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

    • 如果 Block 的執行由於任何原因突然完成,則監視器被解鎖並且同步語句由於同樣的原因突然完成。

您不能輸入同步塊、評估表達式,然后查看與結果關聯的監視器。 您是如何在不評估其表達式的情況下進入該塊的? 您使用什么監視器來同步someGetMethod()本身?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM