猿问

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

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


代码如下:


@ThreadSafe

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

      }

}


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

    }

}


绝地无双
浏览 339回答 1
1回答
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答