【发布时间】:2014-08-27 17:51:30
【问题描述】:
我面临这个问题,我有两个 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 中创建并发哈希图,然后将其设置为 B。
标签: java multithreading synchronization synchronized