Я получил следующий код из книги Гетца (Java Concurrency in Practice).
В книге сказано, что передача ConcurrentMap в качестве параметра в Collections.unmodifiableMap даст «живое» представление местоположений (т. Е. Вызов getLocations() ниже), что означает, что вызов setLocation будет отражаться для вызывающей стороны.
Но передача HashMap в качестве параметра в Collections.unmodifiableMap даст исходное представление (статическое представление) местоположений (то есть вызов getLocationsAsStatic() ниже)
Кто-нибудь объяснит причины этого?Спасибо
@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));
}
}
@Immutable
public class Point {
public final int x, y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}