【发布时间】:2016-12-27 22:28:01
【问题描述】:
我在书 4.3 中读到过。在 Concurrency in Practice 中委派线程安全 使用 final 和 Collections.unmodifiableMap(map) How does DelegatingVehicleTracker (p. 65 Goetz) return a "live" view? 委派线程安全,我尝试创建我的示例并看到一个线程所做的更改没有得到反映返回地图时。我做错了什么
public class MapDem {
final Map<Integer, Integer> map;
final Map<Integer, Integer> map1;
public MapDem() {
map = new HashMap<Integer, Integer>();
map.put(1, 10);
map.put(2, 20);
map1 = Collections.unmodifiableMap(map);
}
public Map<Integer, Integer> getMap() {
return Collections.unmodifiableMap(new HashMap<Integer, Integer>(map));
}
public void setValue(int key,int value){
map.replace(key, value);
}
public static void main(String args[]) {
MapDem demo = new MapDem();
Thread t3 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println(demo.getMap());
}
});
t3.start();
Thread t4 = new Thread(new Runnable() {
@Override
public void run() {
demo.setValue(2, 40);
}
});
t4.start();
try {
t3.join();
t4.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(demo.getMap().size());
}
}
输出是
{1=10, 2=20}
2
or
{1=10, 2=40}
2
我希望地图始终看到更新后的值。
【问题讨论】:
-
请在此处填写您的期望和结果,以便更好地理解您的问题
-
更新了请查收
-
concurentMap 是你想要的吗?
-
我想在没有并发地图的情况下达到同样的效果,请参阅我在问题中提到的链接
标签: java multithreading hashmap