我想知道是否有這種情況下,這種說法將是真實的和需要的。我所見過的所有例子只在「this」引用上同步。有人能告訴我一個對象中的代碼塊如何在除此之外的任何其他引用上同步?在Java中,synchronized塊可以同步任何對象引用?
0
A
回答
0
在Java中,您可以使用結構在任何對象引用上創建內部鎖,是的。閱讀相關Java Tutorial。
的使用與此不立即例子是Class
對象,這是how static synchronized
methods work上同步時。實際上,有很多有效的用途。您可能希望避免使用synchronized (this)
來支持內部實現鎖定,否則您會設置內部使用鎖定的限制,您不知道哪些其他代碼可能會違反。
但是,您應該知道,您經常可以用ReentrantLock
代替。您可以在my post here瞭解更多。
0
是的,它可以做到。
同步塊將使用該對象作爲鎖,而不是整個類。使用synchronized(this){}的人對整個對象設置排它鎖,這可能是您想要的。然而,你可能有一個像persist的東西,這是唯一需要同步的東西。同步(persister){},將提供一個不太精細的方式來做到這一點。
0
1
是的聲明是真實的。
有幾個原因讓人不想使用內部監視器(synchronized(this)
) - 其中一個原因是它可以創建活躍性問題 - 在下面的代碼中,B使用A的一個實例作爲鎖,也許來控制對該變量的訪問。如果另一個線程使用A的相同實例並嘗試運行a.methodA()
,它將被阻止,直到methodB()
結束。
因此,使用內置監視器會暴露同步策略,並可能導致細微的錯誤和性能問題。
public class A {
public synchronized void methodA() {}
}
public class B {
A a = new A();
public void methodB() {
synchronized(a) {
// do something a little long
}
}
public A getA() {return a;}
}
如果A使用了內部監視器,則該問題將不可能實現。
public class A {
private final Object lock = new Object();
public void methodA() {
synchronized(lock) {}
}
}
的另一種情況,其中使用ad hoc監視器有意義是當一個類包含2(或更多)不相關的對象,即兩者都需要以同步的方式進行訪問。因爲現在可以同時訪問2個對象,所以使用2個監視器而不是1個監視器可以減少爭用。
相關問題
- 1. Java - 同步對象/塊
- 2. 在對象引用或值上Java「同步」塊鎖定嗎?
- 3. 分配基於該對象的synchronized塊中的對象(JAVA)
- 4. Java同步對象?
- 5. Java同步對象
- 6. java synchronized同步主題說明
- 7. 是否可以將非同步方法調用爲synchronized?
- 8. 使用不同對象的同步塊
- 9. 在@synchronized節中聲明的塊是否同步?
- 10. Java Synchronized同步所有同步的類之間的方法?
- 11. 同步塊與在Java中
- 12. 是否可以在同一個對象內引用對象?
- 13. 同步塊 - Java
- 14. Java同步塊
- 15. java方法同步對象
- 16. 如何在Java中實現同步塊?
- 17. 同步在java中的對象,然後改變的同步相可變
- 18. 同步和java中的同步塊
- 19. Java中同步方法ans同步塊
- 20. 我可以在java中動態引用一個對象嗎?
- 21. 什麼可以放在同步塊內?
- 22. 混亂有關使用Java同步對象的塊
- 23. 如何獲得synchronized塊對象參數在了Javassist
- 24. 使用@synchronized與同步操作
- 25. synchronized塊
- 26. 同步對象與未同步對象
- 27. 我應該使用Java同步對象
- 28. Java:使用對象列表同步put()
- 29. 同步上的其他對象在Java
- 30. 從同步塊調用此同步方法可以嗎?
固有...總是忘記這個詞。 – 2012-08-09 03:06:19