gpt4 book ai didi

java - 关于书籍示例的问题 - Java 并发实践, list 4.12

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:57:48 30 4
gpt4 key购买 nike

我正在研究 Java 并发实践中的一个示例,但我不理解为什么在以下代码中需要并发安全容器。

我没看到容器如何 “位置”的状态施工后可以修改;因此,由于它是通过“unmodifiableMap”包装器发布的,所以在我看来,普通的 HashMap 就足够了。

EG,是并发访问的,但是map的状态只有reader访问,没有writers访问。 map 中的值字段通过委托(delegate)给“SafePoint”类进行同步,因此虽然点是可变的,但哈希的键及其在 map 中的关联值(对 SafePoint 实例的引用)永远不会改变。

我认为我的困惑是基于问题中集合的确切状态。

谢谢!! -迈克

list 4.12,Java 并发实践,(此 list 可作为 .java here 获得,也可通过谷歌以章节形式获得)

/////////////开始代码

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

//监控 protected 助手类

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

///////////结束代码

最佳答案

你是对的。我认为这是 JCiP 中的一个错误。如果你想要双重确定,我建议你将它发布到(它的)邮件列表: http://gee.cs.oswego.edu/dl/concurrency-interest

就像你说的, map 没有被修改;修改值不会导致 map 上的任何“写入”。

事实上,我的生产代码完全按照您的建议执行,并且我已经在上述邮件列表中询问了有关该代码的问题。 JCiP 的一位作者告诉我,可以为容器使用只读 HashMap 。

这是我的代码的简化版本(没有空检查等)(我最终使用了 google-collection 的 ImmutableMap。):

class Sample {
private final ImmutableMap<Long, AtomicReference<Stuff>> container;

Sample(){
this.container = getMap();
}

void setStuff(Long id, Stuff stuff){
AtomicReference<Stuff> holder = container.get(id);
holder.set(stuff);
}
}

它在极端负载下长时间完美运行。

关于java - 关于书籍示例的问题 - Java 并发实践, list 4.12,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2580370/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com