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

Demo code结束后,有一句话没太理解:“PlublishingVehicleTracker是线程安全的,但是如果它在车辆位置的有效值上施加了任何约束,那么就不再是线程安全的”,SafePoint本身已经通过内置锁保证了对象内数据的线程安全,那么即使在set方法内加入了一些判断location位置的有效性代码也不会导致线程不安全吧。求指点!

代码如下:

@ThreadSafe

public class PublishingVehicleTracker {

private final Map locations;

private final Map unmodifiableMap;

public PublishingVehicleTracker(

Map locations) {

this.locations

= new ConcurrentHashMap(locations);

this.unmodifiableMap

= Collections.unmodifiableMap(this.locations);

}

public Map 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);

}

}

@ThreadSafe

public 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;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值