java并发实战 对象组合问题
并发实战第四章对象组合中,基于委托的车辆追踪器
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
public class DelegatingVehicleTracker {
private final ConcurrentMap<String, Point> locations;
private final Map<String,Point> unmodifiableMap;
public DelegatingVehicleTracker(Map<String,Point> map){
locations = new ConcurrentHashMap<String,Point>(map);
unmodifiableMap = Collections.unmodifiableMap(map);
}
//A:
public Map<String,Point> getLocations(){
return unmodifiableMap;
}
//B:
//返回locations的静态拷贝而非实时拷贝
/*public Map<String,Point> getLocations(){
return Collections.unmodifiableMap(new HashMap<>(locations));
}*/
public Point getLocation(String id){
return locations.get(id);
}
public void setLocation(String id, int x, int y){
this.locations.replace(id, new Point(x, y));
}
public static void main(String[] args) {
DelegatingVehicleTracker tracker = new DelegatingVehicleTracker(new HashMap<String,Point>(){{
put("a",new Point(11, 2));
put("b",new Point(1, 3));
}});
System.out.println(tracker.getLocation("a"));
tracker.setLocation("a",3,5);//修改数据
System.out.println(tracker.getLocation("a"));
//如果调用A方法,返回的将是{a:Point(11, 2),b:Point(1,3)},
//如果调用B方法,返回是{a:Point(3, 5),b:Point(1,3)}
Map<String, Point> locations2 = tracker.getLocations();
System.out.println(locations2);
}
}
class Point{
public final int x,y;
public Point(int x, int y){
this.x = x;
this.y = y;
}
@Override
public String toString() {
return "Point [x=" + x + ", y=" + y + "]";
}
}
书中说A方法返回的是实时的数据,B方法返回的是不变化的数据,我怎么感觉是说反了?
A方法返回的是unmodifiableMap,代码中并没有修改这个对象的地方,而B返回的是locations的一个潜拷贝,这个locations不是可以在setLocation中修改吗,那B方法返回的才应该是实时数据才对,是我哪里理解错了吗
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我觉得你理解的没错。
简单实现了书中所写的A/B线程的场景:
ChangePoint.java
不同getLocations方法实现 返回不同的结果,和你的说明一样:
==============================
查了一圈,结合在stackoverflow上的回答 https://stackoverflow.com/que...
仔细看应该是书籍的印刷问题。
对比图如下:
结论:代码印刷错了害死人。。。
由此可见,1 看原版真的比较好;2 技术书籍翻译质量堪忧。