Почему CopyOnWriteArrayList отличается от итерации по немодифицируемому списку?

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


person AKS    schedule 29.11.2014    source источник
comment
Вы спрашиваете о разнице между итерацией по CopyOnWriteArrayList и итерацией по List, возвращаемой вызванным Collections.unmodifiableList(..)?   -  person Sotirios Delimanolis    schedule 29.11.2014
comment
Основное отличие состоит в том, что он изменчив и безопасен для потоков. Неизменяемый список... неизменяемый. В Java нет встроенных неизменяемых типов — не сообщая нам, какую реализацию вы используете, это все, что мы можем сказать.   -  person Boris the Spider    schedule 29.11.2014
comment
@SotiriosDelimanolis Нет, мой вопрос связан с актуальностью этого CopyOnWriteArrayList. И не можем ли мы получить ту же функцию, просто используя ImmutableList, который является USP (уникальной точкой продажи) CopyOnWriteArrayList.   -  person AKS    schedule 29.11.2014
comment
@SotiriosDelimanolis USP является уникальным преимуществом.   -  person Boris the Spider    schedule 29.11.2014
comment
Вы смешиваете здесь много понятий; Характеристикой списка COW является то, что он потокобезопасен; характеристика Collections.unmodifiedList() заключается в том, что она отключает модификации для этого списка.   -  person fge    schedule 29.11.2014


Ответы (1)


В javadoc из CopyOnWriteArrayList указано

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

В то время как javadoc Collections#unmodifiableList(List) указывает

Возвращает неизменяемое представление указанного списка. Этот метод позволяет модулям предоставлять пользователям доступ «только для чтения» к внутренним спискам.

Операции запроса в возвращенном списке "прочитаны" до указанного списка и попытки изменить возвращенный список, будь то напрямую или через его итератор, приводят к UnsupportedOperationException.

Итак, нет, вы не можете получить функции, предоставляемые CopyOnWriteArrayList, с List, возвращаемым Collections#unmodifiableList(List).

person Sotirios Delimanolis    schedule 29.11.2014