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;
}
}
總結
以上是生活随笔為你收集整理的java 并发demo_《Java并发编程实践》中4.3.5章demo的一个疑问?的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: mysql 查询二维数组_sql数据库查
- 下一篇: java web后端技能树_后端技能树修
