Unterschiedlicher 'nächster' Eintrag von ConcurrentHashMap in JDK 1.6 und JDK 1.7

8

In Douglas Lea verwendet JDK 1.6 final vor dem Feld next .

%Vor%

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?

    
chain ro 15.07.2015, 12:05
quelle

2 Antworten

2

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.

    
John Vint 15.07.2015, 15:08
quelle
0

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.

    
user158037 15.07.2015 13:08
quelle