为了账号安全,请及时绑定邮箱和手机立即绑定

《Java并发编程实践》中4.3.5章demo的一个疑问?

《Java并发编程实践》中4.3.5章demo的一个疑问?

绝地无双 2019-03-20 17:19:44
Demo code结束后,有一句话没太理解:“PlublishingVehicleTracker是线程安全的,但是如果它在车辆位置的有效值上施加了任何约束,那么就不再是线程安全的”,SafePoint本身已经通过内置锁保证了对象内数据的线程安全,那么即使在set方法内加入了一些判断location位置的有效性代码也不会导致线程不安全吧。求指点!代码如下:@ThreadSafepublic class PublishingVehicleTracker {    private final Map<String, SafePoint> locations;    private final Map<String, SafePoint> unmodifiableMap;    public PublishingVehicleTracker(                            Map<String, SafePoint> locations) {        this.locations            = new ConcurrentHashMap<String, SafePoint>(locations);        this.unmodifiableMap            = Collections.unmodifiableMap(this.locations);    }    public Map<String, SafePoint> getLocations() {        return unmodifiableMap;    }    public SafePoint getLocation(String id) {        return locations.get(id);    }    public void setLocation(String id, int x, int y) {        if (!locations.containsKey(id))            throw new IllegalArgumentException(                "invalid vehicle name: " + id);        locations.get(id).set(x, y);      }}@ThreadSafepublic class SafePoint {    @GuardedBy("this") private int x, y;    private SafePoint(int[] a) { this(a[0], a[1]); }    public SafePoint(SafePoint p) { this(p.get()); }    public SafePoint(int x, int y) {        this.x = x;        this.y = y;    }    public synchronized int[] get() {        return new int[] { x, y };    }    public synchronized void set(int x, int y) {        this.x = x;        this.y = y;    }}
查看完整描述

1 回答

  • 1 回答
  • 0 关注
  • 338 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号