Этот метод является его копией в Javas ConcurrentHashMap .
Этот тип Map
использует modCount
для сегмента для отслеживания во время операций, если он остался неизменным по различным ступеням. Во время нашего обхода карты на самом деле могут быть другие операции, модифицирующие карту. Это называется ABA проблема . Мы спрашиваем карту, если она пуста, и на самом деле это не так, но случайно она кажется. Простой пример:
Map with three segements
Segment 1: size=0
Segment 2: size=0
Segment 3: size=1
В этот момент мы решаем спросить карту и посмотреть на сегмент 1, который кажется пустым.
Теперь приходит другой алгоритм и вставляет элемент в сегмент 1, но удаляет другой из сегмента 3. Карта никогда не была пустой.
Наш поток снова запущен, и мы смотрим на сегменты 2 и 3, оба они пусты. Для нас карта пуста - в результате.
Но для любого пустого слота мы отслеживали, был ли он модифицирован тоже. И для слота 3 мы понимаем, что были модификации: mc[2]>=1
, что означает mcsum>=1
. Это значит: с момента постройки Карта была изменена хотя бы один раз. Итак, чтобы ответить, для чего предназначен mcsum: это ярлык для пустого ConcurrentHashMap по умолчанию. Если изменений никогда не было, нам не нужно проверять наличие одновременных изменений.
Итак, мы знаем, что что-то случилось, и проверяем снова каждый сегмент. Если сейчас сегмент пуст, мы знаем, что это за modCount
. Для сегмента 3 предположим, что это было 1, для сегмента 1 это было 0. Проверка modCount
сегмента 1 теперь это 1, а count
равно> 0, поэтому мы знаем, что карта не пуста.
Тем не менее, во втором цикле может быть проблема ABA. Но поскольку мы знаем modCounts, мы можем поймать любой другой параллельный алгоритм, который что-то меняет. Таким образом, мы говорим, что если сегмент пуст и что-то изменилось с помощью modCount, он не был пустым. То есть, что делает второй цикл.
Надеюсь, это поможет.
EDIT
И что более важно, как я могу получить
if (segments[i].count != 0 || mc[i] != segments[i].modCount)
, чтобы оценить как истинное?
Это дает значение true, если сегмент содержит что-то или что-то было изменено с момента первого цикла. И оно оценивается как ложное (что означает: сегмент пуст), если сегмент не содержит ничего И ничего не изменилось с момента первого цикла. Или, если сказать по-другому: мы можем быть уверены, что он был пустым все время с тех пор, как впервые посмотрел на проверенный сегмент.