Я работаю над примером в Java Concurrency на практике и не понимаю, почему в следующем коде необходим безопасный для одновременного контейнера.
Я не вижу, как контейнер
состояние "локации"
могут быть изменены после строительства; поэтому, поскольку он публикуется через оболочку «unmodifiableMap», мне кажется, что обычного HashMap будет достаточно.
EG, к нему обращаются одновременно, но состояние карты доступно только читателям, а не писателям. Поля значений на карте синхронизируются посредством делегирования классу «SafePoint», поэтому, пока точки являются изменяемыми, ключи для хэша и связанные с ними значения (ссылки на экземпляры SafePoint) на карте никогда не изменяются.
Я думаю, что мое замешательство основано на том, в каком именно состоянии находится проблема.
Спасибо !! -Mike
Листинг 4.12, Параллелизм Java на практике,
(этот список доступен как .java здесь , а также в форме главы через Google)
///////////// код начала
@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;
}
} * * тысяча двадцать-один
/////////// код конца