gpt4 book ai didi

java - DelegatingVehicleTracker (p. 65 Goetz) 如何返回 "live" View ?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:12:50 25 4
gpt4 key购买 nike

在 Java Concurrency in Practice 的第 65 和 66 页,Brian Goetz 列出了以下代码:

@ThreadSafe
public class DelegatingVehicleTracker {
private final ConcurrentMap<String, Point> locations;
private final Map<String, Point> unmodifiableMap;

public DelegatingVehicleTracker(Map<String, Point> points) {
locations = new ConcurrentHashMap<String, Point>(points);
unmodifiableMap = Collections.unmodifiableMap(locations);
}

public Map<String, Point> getLocations() {
return unmodifiableMap;
}

public Point getLocation(String id) {
return locations.get(id);
}

public void setLocation(String id, int x, int y) {
if (locations.replace(id, new Point(x, y)) == null)
throw new IllegalArgumentException("invalid vehicle name: " + id);
}

// Alternate version of getLocations (Listing 4.8)
public Map<String, Point> getLocationsAsStatic() {
return Collections.unmodifiableMap(
new HashMap<String, Point>(locations));
}
}

关于这个类,Goetz 写道:

"...the delegating version [the code above] returns an unmodifiable but 'live' view of the vehicle locations. This means that if thread A calls getLocations() and thread B later modifies the location of some of the points, those changes are reflected in the map returned to thread A."

线程 A 的 unmodifiableMap 在什么意义上是“活的”?我看不到线程 B 通过调用 setLocation() 所做的更改将如何反射(reflect)在线程 A 的 unmodifiableMap 中。这似乎只有当线程 A 构造了一个新的 DelegatingVehicleTracker 实例时才会出现这种情况。但是如果线程 A 持有对此类的引用,我不明白这怎么可能。

Goetz 继续说,可以调用 getLocationsAsStatic(),前提是“所需的舰队 View 不变”。我很迷惑。在我看来,情况恰恰相反,对 getLocationsAsStatic() 的调用确实会返回“实时” View ,而对 getLocations() 的调用,如果类没有重新构造,将返回静态的、不变的 View 的车队。

在这个例子中我错过了什么?

感谢任何想法或观点!

最佳答案

我认为你的困惑是由于对 Collections.unmodifiableMap 的误解造成的。不允许直接更改由 Collections.unmodifiableMap 返回的映射,但是,更改支持映射完全没问题(只要支持映射允许更改)。例如:

Map<String,String> map = new HashMap<>();
Map<String, String> unmodifiableMap = Collections.unmodifiableMap(map);

map.put("key","value");

for (String key : unmodifiableMap.keySet()) {
System.out.println(key); // prints key
}

因此,DelegatingVehicleTracker 示例中的 unmodifiableMap 由可变 map locations 支持(线程安全一)。 setLocation 以原子方式改变 locations,因此对于持有对 unmodifiableMap 的引用的线程来说,更改将是可见的,因为知道这些线程不能改变 不可修改的 map 。读者无法访问 locations,因此只能通过 DelegatingVehicleTracker 对其进行更改,因此得名 delegation

关于java - DelegatingVehicleTracker (p. 65 Goetz) 如何返回 "live" View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33532745/

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