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!

Antworten auf die Frage(2)

Ihre Antwort auf die Frage