[英]Calling a synchronized method from another synchronized method, both on different 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.