In Douglas Lea verwendet JDK 1.6 final
vor dem Feld next
.
Während in JDK 1.7 das Feld next
vor volatile
steht. Ich bemerke auch, dass die Methode get
in JDK 1.7 die Methode getObjectVolatile
verwendet, um das Feld value
zu lesen, das die volatile Ladesemantik enthält.
Ich habe keinen Sinn, warum Doug Lea vorher final
benutzt hat. Wenn es Probleme mit der Korrektheit gibt, wie könnte er sie in% JDK 1.7 (auch JDK 1.8) durch volatile
ersetzen?
Bearbeiten:
Insbesondere lautet meine Frage, ob wir in der Implementierung von JDK 1.6 final
durch volatile
ersetzen könnten?
Für Ihre erste Frage:
Ich habe keinen Sinn warum Doug Lea vorher das Finale benutzt hat. Wenn es gibt Probleme mit der Korrektheit, wie könnte er sie dann durch flüchtige ersetzen? in JDK 1.7 (auch JDK 1.8)?
Es war keine Frage der Korrektheit. Beide Implementierungen sind hinsichtlich der Fadensicherheit korrekt. Was versucht werden sollte, war die Reduzierung des anfänglichen Fußabdrucks des CHM. In Java 6 musste das Objekt next
final mit mindestens einem Platzhalter erstellt werden. Dies führte zu einer übermäßigen Erzeugung leerer Objekte und wurde daher geändert, um eine Semantik für die Erstellung bei Bedarf bereitzustellen.
Genauer gesagt ist meine Frage, dass wir das Finale durch flüchtige ersetzen könnten in der Implementierung von JDK 1.6?
Gewiss, solange die Operationen sequentiell konsistent sind, was sie sind.
Einer von Doug Leas Kommentaren berührt diese Designänderung
%Vor% Um eine andere Frage zu beantworten, die Sie wahrscheinlich haben, warum wurde final
ursprünglich ausgewählt? Um einige flüchtige Lesevorgänge später zu verhindern.
Es kommt nicht darauf an, final
durch volatile
zu ersetzen. Wie RealSkeptic wurde es unter vielen anderen Methoden geändert. Der Zweck könnte die Optimierung von ConcurrentHashMap.remove()
sein. In JDK1.6 ist die Liste, die Bucket speichert (Objekte gruppiert nach Hashcode) CopyOnWrite, so dass remove()
Teil der Liste kopiert wird, in JDK1.7 wird nur next
pointer geändert.
Tags und Links java concurrency hashmap concurrenthashmap java.util.concurrent