Je viens de trouver ce code étrange dans la méthode de calcul ConcurrentHashMap: (ligne 1847)
public V compute(K key,
BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
...
Node<K,V> r = new ReservationNode<K,V>();
synchronized (r) { <--- what is this?
if (casTabAt(tab, i, null, r)) {
binCount = 1;
Node<K,V> node = null;
Le code effectue donc la synchronisation sur une nouvelle variable disponible uniquement pour le thread actuel. Cela signifie qu'il n'y a pas d'autre thread en concurrence pour ce verrou ou pour provoquer des effets de mémoire cache.
Quel est le but de cette action? Est-ce une erreur ou des effets secondaires non évidents dont je ne suis pas au courant?
ps jdk1.8.0_131