Сразу после того, как код приобрел монитор объекта, ссылка на объект хранится в tab
, который является глобально видимым массивом узлов, которые составляют содержимое ConcurrentHashMap
:
Node<K,V> r = new ReservationNode<K,V>();
synchronized (r) {
if (casTabAt(tab, i, null, r)) {
В этот момент другие потоки, выполняющие другие методы модификации на одном и том же ConcurrentHashMap
, могут столкнуться с этим неполным узлом при обходе глобального массива, другими словами, ссылка Node
сбежала.
В то время как в точке, где был сконфигурирован ReservationNode
, нет возможности для конкуренции на вновь созданном объекте, в других методах, которые синхронизируются на Node
s, найденных в массиве, может быть утверждение точно что Node
.
Это похоже на «приоритетную синхронизацию». Создатель синхронизируется в точке, где ссылка еще не была экранирована, поэтому она будет успешной, пока в точке, где выполняется эта ссылка, все остальные потоки должны будут ждать в маловероятном (но все же возможном) событии, к которому они обращаются точно это Node
.