ConcurrentNavigableMap, интерпретация слабосогласованных итераторов - PullRequest
3 голосов
/ 06 ноября 2011

В JavaDoc для ConcurrentNavigableMap я немного сбит с толку по поводу следующего:

Итератор представления - это "слабосогласованный" итератор, который никогда не вызовет ConcurrentModificationExceptionи гарантирует прохождение элементов в том виде, в каком они существовали при создании итератора, и может (но не гарантирует) отражать любые модификации, следующие после создания.

Формулировка выглядит одинаковой в реализациях интерфейсакак ConcurrentSkipListMap.

Что это значит, это кажется противоречием - либо оно может гарантировать прохождение элементов в том виде, в каком они существовали при построении, либо ИЛИ может отражать модификации, следующие после построения ??

ОБНОВЛЕНИЕ:Мне бы очень хотелось знать, создает ли создание итератора в ConcurrentNavigableMaps, например, ConcurrentSkipListMap, представление карты в виде «моментального снимка».

Ответы [ 2 ]

4 голосов
/ 08 ноября 2011

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

Автор ConcurrentHashMap и ConcurrentSkipListMap, Дуг Ли, , похоже, согласен , что гарантия совсем не является гарантией, а в случае ConcurrentHashMap итератор может сообщить, что карта в состоянии, которое никогда не было на самом деле в.

Для любопытных источник ConcurrentSkipListMap, в частности его внутренний класс Iter (iterator), равен здесь .

Итератор в ConcurrentSkipListMap итерирует обычные узлы в списке пропуска, и эти узлы связаны с использованием изменчивых ссылок. Может случиться так, что это несколько запутанное утверждение JavaDoc на самом деле [просто] ссылается на гарантию «произойдет раньше». то есть изменения, внесенные другими потоками до создания итератора, будут просто видны потоку, управляющему итерацией.

2 голосов
/ 06 ноября 2011

Формулировка странная, но на самом деле это означает, что итератор может отражать некоторые из изменений, внесенных после создания итератора, но он не обязательно отражает их все. За исключением этих отраженных изменений, элементы пересекаются в том виде, в каком они существовали при строительстве.

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

...