我面臨這個問題,我有兩個類A和B,'A類'有兩個線程t1和t2,它試圖訪問'B類'地圖如下,現在的問題是,我無法對B類地圖進行任何更改,因此我無法使用synchronised
關鍵字,或者我無法將其置於同步方法中。所以我的疑問是,有沒有其他的方式來同步這張地圖。多線程訪問一個不同步的地圖
public class A{
static B b = new B();
public static void main(String[] args) {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
Map<Integer,String> map = Collections.synchronizedMap(b.getMap());
map.put(1, "one");
map.put(2, "two");
map.put(3, "three");
b.setMap(map);
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
Map<Integer,String> map = Collections.synchronizedMap(b.getMap());
map.put(4, "four");
map.put(5, "five");
map.put(6, "six");
b.setMap(map);
}
});
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for(Map.Entry<Integer, String> entry : b.getMap().entrySet()){
System.out.println(entry.getKey() + ":" + entry.getValue());
}
}
我使用LinkedHashMap
,僅跟蹤插入的順序(忽略性能問題)
public class B{
private Map<Integer,String> map = new LinkedHashMap<Integer,String>();
public Map<Integer,String> getMap() {
return map;
}
public void setMap(Map<Integer,String> map) {
this.map = map;
}
}
正如我所看到的,您可以選擇從B公開的setMap,只需在A中創建併發hashmap,然後將其設置爲B. – Adi 2014-08-27 17:53:52