【发布时间】:2020-03-29 13:22:10
【问题描述】:
我在实践中阅读 java 并发。我遇到了这个sn-p,这让我有些困惑。 如果需要车队的不变视图,getLocations 可以改为返回位置图的浅表副本。由于 Map 的内容是不可变的,所以只需要复制 Map 的结构,不需要复制内容。
public Map<String,Point> getLocations(){
return Collections.unmodifiableMap(new HashMap<String,Point>(locations));
}
返回车辆位置的不可修改但实时的视图。
public Map<String,Point> getLocations(){
return unmodifiableMap; //unmodifiableMap = Collections.unmodifiableMap(locations);
}
public class Point{
public final int x,y;
public Point(int x, int y){
this.x = x;
this.y=y;
}
}
public void setLocation(String id,int x,int y){
if(locations.replace(id,new Point(x,y==null)
//throw exception for invalid vehicle
}
这是否意味着new HashMap<String,Point>(locations) 正在对位置图进行深层复制,并在复制发生时通过为 Point 创建一个新对象来分配新的引用。不应该浅拷贝new HashMap<String,Point>(locations) 保留对 Point 对象的原始引用,并且更改在所有线程中可见。
【问题讨论】:
-
你认为它为什么会执行深拷贝?我认为这里的重点是,对于不可变对象,仅复制引用而不是对象本身就足够了。
-
但是为什么它声明更改在其他线程中不可见?
-
Collections.unmodifiableMap(new HashMap
(locations)); vs 不可修改的地图;我的困惑就在这里。对于第一个更改在其他线程中不可见,第二个更改将是 -
它在哪里谈到更改对其他线程可见?它只是说 - 你想要一份地图当前状态的副本(这意味着未来的变化不应该影响这个副本)还是反映未来变化的地图视图(这意味着它是由真实的地图)?
-
(那个
Point类应该是final。)