Поведение CopyOnWriteArrayList

Javadocs из CopyOnWriteArrayList говорит

Нитевидный вариант ArrayList, в котором все мутативные операции (добавление, набор и т.д.) реализуются путем создания новой копии базовый массив.

Я запутался, когда другие потоки будут видеть изменения, присутствующие в этой новой копии? Означает ли это, что количество копий базового массива будет равным количеству мутаций коллекции? Если это не так, когда изменения этих отдельных копий переносятся в базовый массив, чтобы другие потоки могли их видеть?

Ответы

Ответ 1

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

Означает ли это, что будет число копии базового массива равны к числу мутаций Коллекция

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

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

Массив, который вы сейчас просматриваете (скажем, ваш итератор), никогда не изменится. Когда вы читаете из массива, вы читаете его, как это было, когда вы начали читать. Если CopyOnWriteArrayList изменяется другим потоком, массив, который вы сейчас наблюдаете, не будет выполняться.

Чтобы получить самую обновленную версию, прочитайте новый текст как list.iterator();

При этом обновление этой коллекции также приведет к урон производительности. Если вы попытаетесь отсортировать CopyOnWriteArrayList, вы увидите, что список выбрал UsupportedOperationException (сортировка вызывает набор в коллекции N раз). Вы должны использовать это чтение только в том случае, если вы читаете 90 +%.