我面临这个问题,我有两个类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