- Ce qui m'intrigue c'est ça.
Java doc de HashEntry dans ConcurrentHashMap (jdk1.6.0_16)Lors d'une course de données, un thread peut-il lire la valeur nulle initiale de la variable volatile? surtout quand une valeur non nulle lui est assignée dans le constructeur?
... Parce que le champ de valeur est volatile WRT, pas définitive, il est légal le modèle Java mémoire pour un lecteur non synchronisé pour voir null au lieu de la valeur initiale lors de la lecture via une course de données. Bien qu'un réarrangement menant à cela ne se produise probablement jamais, la méthode Segment.readValueUnderLock est utilisée comme sauvegarde dans le cas où une valeur nulle (pré-initialisée) est jamais vue dans une méthode d'accès non synchronisée.
ici est la mise en œuvre de la méthode get de ConcurrentHashMap # Segment
V get(Object key, int hash) { if (count != 0) { // read-volatile HashEntry e = getFirst(hash); while (e != null) { if (e.hash == hash && key.equals(e.key)) { V v = e.value; if (v != null) return v; return readValueUnderLock(e); // recheck } e = e.next; } } return null; }
Et readValueUnderLock
V readValueUnderLock(HashEntry e) {
lock();
try {
return e.value;
} finally {
unlock();
}
}
Sur la base de ma lecture et la compréhension de chaque fil volonté lire une valeur à jour de la variable volatile.
Alors, quand un thread lit-il une valeur nulle initiale? en particulier dans HashEntry où la valeur est assignée avant que le constructeur ne l'achève. (A noter également que la référence de HashEntry n'échappe à son constructeur.)
Je suis perplexe, quelqu'un peut expliquer le doc java ci-dessus HashEntry dans ConcurrentHashMap (jdk1.6.0_16). et pourquoi ce verrouillage supplémentaire de précaution est nécessaire?
À quoi ressemble votre constructeur? Est-ce qu'il fuit des références avant qu'il se termine? Sinon, tout ira bien. – Gabe
Comme je l'ai déjà mentionné dans ma question (deuxième dernier point). "Notez également que la référence de HashEntry n'échappe jamais à son constructeur". Je n'ai pas passé le code ici, pour réduire l'encombrement et parce que c'était un simple constructeur d'affectation. – Jigar