Обход в ConcurrentHashMap - PullRequest
       57

Обход в ConcurrentHashMap

3 голосов
/ 12 января 2012
  1. Почему значение в Entry классе ConcurrentHashMap изменчиво.

  2. Во время обхода происходит проверка в ConcurrentHashMap, что когдаvalue в классе Entry в нуле, он блокирует весь сегмент и пытается снова прочитать значение.В каком случае одно только значение может быть нулевым?Вся запись должна иметь нулевое значение, а не только значение.

  3. И как блокировка всего сегмента обеспечивает правильный обход в случае, если значение становится нулевым.

1 Ответ

1 голос
/ 12 января 2012
  1. Значение является в основном изменчивым, поэтому ConcurrentHashMap не нужно блокировать чтения.Когда put 'CHM блокирует сегмент, чтобы гарантировать один пут на каждый сегмент, но другим потокам все еще разрешено читать из этого сегмента, и, поскольку значение является изменчивым, CHM по-прежнему поддерживает порядок «до того, как произойдет».1005 *

  2. JMM позволяет отложить или переупорядочить энергозависимое хранилище в конструкторе после публикации объекта.Таким образом, возможно, что хотя Запись опубликована, изменчивое поле еще предстоит сделать видимым.Это было введено, чтобы быть «сверхбезопасным», но на практике этого не произойдет (по крайней мере, в Java 6)

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

...