Синхронизация по локальной переменной

Я заметил странную конструкцию в ConcurrentHashMap compute и computeIfAbsent методы :

Node<K,V> r = new ReservationNode<K,V>();
synchronized (r) {
  //...
}

Какой смысл синхронизировать локальный объект, учитывая, что JIT, скорее всего, будет воспринимать его как неактивный?

27 голосов | спросил assylias 21 +04002014-10-21T12:28:43+04:00312014bEurope/MoscowTue, 21 Oct 2014 12:28:43 +0400 2014, 12:28:43

1 ответ


0

Сразу после того, как код получил монитор объекта, ссылка на объект сохраняется в tab, который является глобально видимым массивом. узлов, которые составляют содержимое ConcurrentHashMap:

Node<K,V> r = new ReservationNode<K,V>();
synchronized (r) {
    if (casTabAt(tab, i, null, r)) {

В этот момент другие потоки, выполняющие другие методы модификации на том же ConcurrentHashMap, могут встретиться с этим неполным узлом при обходе глобального массива, иными словами, ссылка Node не используется.

В то время как в точке, где ReservationNode, нет никакой возможности для спора о вновь созданном объекте, в другом методы, которые синхронизируются в Node, найденных в массиве, могут быть конфликты именно для этого Node

Это похоже на синхронизацию приоритетов. Создатель выполняет синхронизацию в точке, где ссылка еще не была экранирована, поэтому он гарантированно будет успешным, в то время как в точке, где ссылка выходит, все другие потоки должны будут ждать в маловероятном (но все еще возможном) событии, к которому они обращаются именно это Node.

ответил Holger 21 +04002014-10-21T13:07:55+04:00312014bEurope/MoscowTue, 21 Oct 2014 13:07:55 +0400 2014, 13:07:55

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132