我正在研究一個代碼,它在其構造函數中接受一個Map,並將其分配給一個實例變量。任何使用這個實例變量map
的方法都是同步的。如何同步傳遞給多個地方的實例?
class Foo {
Map<Int, Int> map;
Foo (Map<Int, Int> map) {
this.map = map;
}
synchornized void put(int x, int y) {
map.put(x, y);
}
}
但是 - 客戶端創建了Foo的多個實例,並將相同的地圖實例傳遞給它們中的每一個。
Map<Int, Int> map = new HashMap<Int, Int>();
new Foo(map);
new Foo(map);
如何在不同情況下使用時,不會map
得到同步? 使問題更廣泛,如何同步全局實例類?
1.使用ConcurrentHashMap不必解決問題:只有當「複雜操作」是ConcurrentMap的API的一部分時,ConcurrentMap纔有用。如果開發人員需要對Map執行多個操作並且希望它是原子操作,並且這種操作不是由ConcurrentMap提供的,那麼它不會提供幫助。即使使用ConcurrentHashMap,數據仍然不一致。 2.在課堂上同步是不合理的,因爲從概念上講,MAP是需要工作的資源並因此獲得鎖定。 –
如果問題更復雜並且在給定的「交易」中使用多個地圖操作,那麼你是對的。但考慮到這個問題,這三個選項是有效的。 – Jason
問題實際上是「讓問題更廣泛,如何同步全局實例類?」 –