casTabAt(tab, i, null, r)
is publishing the reference to r
.
static final <K,V> boolean casTabAt(Node<K,V>[] tab, int i,
Node<K,V> c, Node<K,V> v) {
return U.compareAndSwapObject(tab, ((long)i << ASHIFT) + ABASE, c, v);
}
Because c
is being put into tab
, it is possible that it is accessed by another thread, e.g. in putVal
. As such, this synchronized
block is necessary to exclude other threads from doing other synchronized things with that Node
.