e.hash == hash && key.equals(e.key)
La phrase précédente montre qu'il y a ceci key dans le tableau. Regardez la méthode put Lorsque value est null, une exception sera levée :
key
put
value
null
public V put(K key, V value) { Segment<K,V> s; if (value == null) throw new NullPointerException(); int hash = hash(key); int j = (hash >>> segmentShift) & segmentMask; if ((s = (Segment<K,V>)UNSAFE.getObject // nonvolatile; recheck (segments, (j << SSHIFT) + SBASE)) == null) // in ensureSegment s = ensureSegment(j); return s.put(key, hash, value, false); }
Il s'agit d'une version supérieure de la mienne. Elle peut être différente de la vôtre, mais la valeur ne peut pas être vide. Donc :
if (v != null) return v; return readValueUnderLock(e); // recheck
S'il n'est pas vide, il peut être renvoyé directement. S'il est vide, cela signifie que d'autres threads l'exploitent. Alors je l'ai ajouté.
public V get(Object key) { Segment<K,V> s; // manually integrate access methods to reduce overhead HashEntry<K,V>[] tab; int h = hash(key); long u = (((h >>> segmentShift) & segmentMask) << SSHIFT) + SBASE; if ((s = (Segment<K,V>)UNSAFE.getObjectVolatile(segments, u)) != null && (tab = s.table) != null) { for (HashEntry<K,V> e = (HashEntry<K,V>) UNSAFE.getObjectVolatile (tab, ((long)(((tab.length - 1) & h)) << TSHIFT) + TBASE); e != null; e = e.next) { K k; if ((k = e.key) == key || (e.hash == h && key.equals(k))) return e.value; } } return null; }
La version actuelle de la méthode get se transforme HashEntry<K,V> e en UNSAFE.getObjectVolatile() pour l'obtenir, comme celle de volatile
get
HashEntry<K,V> e
UNSAFE.getObjectVolatile()
volatile
L'affiche peut mettre à jour le JDK. J'ai utilisé 1.8 pour rechercher, mais je n'ai pas trouvé ce code dans ConcurrentHashMap.
1.8
ConcurrentHashMap
L'objet est nul lorsqu'il est initialisé. Ce nul n'est pas attribué spécifiquement dans le programme.
La phrase précédente montre qu'il y a ceci
.key
dans le tableau. Regardez la méthodeput
Lorsquevalue
estnull
, une exception sera levée :Il s'agit d'une version supérieure de la mienne. Elle peut être différente de la vôtre, mais la valeur ne peut pas être vide.
Donc :
S'il n'est pas vide, il peut être renvoyé directement. S'il est vide, cela signifie que d'autres threads l'exploitent. Alors je l'ai ajouté.
La version actuelle de la méthode
get
se transformeHashEntry<K,V> e
enUNSAFE.getObjectVolatile()
pour l'obtenir, comme celle devolatile
L'affiche peut mettre à jour le JDK. J'ai utilisé
1.8
pour rechercher, mais je n'ai pas trouvé ce code dansConcurrentHashMap
.L'objet est nul lorsqu'il est initialisé. Ce nul n'est pas attribué spécifiquement dans le programme.