Double Checked Locking mit regulärer HashMap
Zurück zur Parallelität. Inzwischen ist klar, dass für diedouble checked locking
um zu arbeiten muss die Variable als @ deklariert werdvolatile
. Aber was ist, wenn die doppelt überprüfte Verriegelung wie folgt verwendet wird.
class Test<A, B> {
private final Map<A, B> map = new HashMap<>();
public B fetch(A key, Function<A, B> loader) {
B value = map.get(key);
if (value == null) {
synchronized (this) {
value = map.get(key);
if (value == null) {
value = loader.apply(key);
map.put(key, value);
}
}
}
return value;
}
}
Warum muss es wirklich ein @ se ConcurrentHashMap und kein reguläres HashMap? Alle Änderungen an der Karte werden innerhalb des @ -Zeichens vorgenommesynchronized
block und der Code verwendet keine Iteratoren, daher sollte es technisch gesehen keine "gleichzeitigen Änderungs" -Probleme geben.
Bitte vermeiden Sie die Verwendung vonputIfAbsent
/computeIfAbsent
wie ich nach dem @ fraKonzep und nicht die Verwendung von API :) es sei denn, die Verwendung dieser API trägt zu @ bHashMap
vsConcurrentHashMap
Gegenstand
Update 30.12.2016
Diese Frage wurde mit einem Kommentar von Holger "@ beantworteHashMap.get
ändert die Struktur nicht, sondern Ihr Aufruf vonput
tut. Da gibt es einen Aufruf vonget
außerhalb des synchronisierten Blocks kann ein unvollständiger Zustand eines @ angezeigt werdput
Operation geschieht gleichzeitig. "Danke!