A pagina 65 e 66 di Java Concurrency in Practice Brian Goetz elenca il seguente codice:In che modo DelegatingVehicleTracker (p. 65 Goetz) restituisce una visualizzazione "live"?
@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));
}
}
A proposito di questa classe Goetz scrive:
" ... la versione delegante [il codice di cui sopra] restituisce una vista "live" non modificabile ma "live" dei luoghi del veicolo Ciò significa che se il thread A chiama getLocations() e il thread B modifica in seguito la posizione di alcuni dei punti , tali modifiche si riflettono nella mappa restituita al thread A ".
In che senso la "Modifica" di Thread A non può essere "live"? Non vedo come le modifiche apportate da Thread B tramite chiamate a setLocation() si riflettano nellaMod non modificabile di Thread A. Questo sembra il caso solo se il thread A ha costruito una nuova istanza di DelegatingVehicleTracker. Ma il thread A contiene un riferimento a questa classe, non vedo come ciò sia possibile.
Goetz prosegue dicendo che getLocationsAsStatic() potrebbe essere definito come una "immutabile visione della flotta richiesta". Sono confuso. Mi sembra che proprio l'opposto sia il caso, che una chiamata a getLocationsAsStatic() restituisca effettivamente la vista "live" e una chiamata a getLocations(), se la classe non sia stata costruita di nuovo, restituisca la vista statica e invariata della flotta di macchine.
Cosa mi manca qui in questo esempio?
Tutti i pensieri o le prospettive sono apprezzati!
Grazie Sleiman, e altri; ora capisco. Spiegherò a me stesso (di usare sperabilmente agli altri): DelegatingVehicleTracker può modificare, ma le classi client non possono. Una chiamata a unmodifiableMap nel tuo codice di esempio sopra genererebbe un'eccezione (l'ho provata), ma, ovviamente, l'insert to map non lo fa. UnmodifiableMap è come uno spettacolo di marionette visto attraverso uno schermo di vetro che impedisce al pubblico di intromettersi. –
@BenWeaver c'è un termine per la metafora che hai appena descritto, è la delega –
Grazie, Sleiman! –