【发布时间】:2016-01-04 06:15:47
【问题描述】:
我正在阅读 B. Goetz Java Concurrency In Practice,现在我正在阅读有关委派线程安全的部分。他提供了以下示例:
@Immutable
public class Point{
public final int x, y;
public Point(int x, int y){
this.x = x;
this.y = y;
}
}
@ThreadSafe
public class DelegatingVehicleTracker {
private final ConcurrentMap<String, Point> locations;
private final Map<String, Point> unmodifiableMap;
public DelegatingVehicleTracker(Map<String, Point> points){
locations = new ConcurrentHashMap<String, Point>(points);
unomdifiableMap = Collections.unmodifiableMap(locations);
}
public Map<String, Point> getLocations(){
return unmodifiableMap;
}
public Point getLocation(String id){
return locations.get(id);
}
public void setLocation(String id, int x, int y){
if(locations.replace(id, new Point(x, y)) == null)
throw new IllegalArgumentException("invalid vehicle id: " + id);
}
}
他说
如果线程 A 调用 getLocations 并且线程 B 稍后修改 一些点的位置,这些变化反映在
Map返回线程 A。正如我们之前所说,这可能是一个 利益(更多最新数据)或负债(可能 车队的不一致视图),具体取决于您的要求。
我不明白它的缺点。为什么舰队的观点可能变得不一致。所有对象都是不可变的。
【问题讨论】:
标签: java multithreading