Мне нужна структура, подобная ArrayList, позволяющая выполнять только следующие операции
-
get(int index) -
add(E element) -
set(int index, E element) -
iterator()
Из-за того, что итератор используется во многих местах, использование Collections#synchronizedList будет слишком подверженным ошибкам. Список может вырасти до нескольких тысяч элементов и много используется, поэтому я уверен, что CopyOnWriteArrayList будет слишком медленным. Я начну с этого, чтобы избежать преждевременных оптимизаций, но я бы сказал, что это не сработает.
Большинство обращений будут однопоточными. Поэтому я спрашиваю, для чего нужна правильная структура данных.
Я, хотя обертывание synchronizedList в чем-то обеспечит синхронизированный итератор, но это не будет из-за ConcurrentModificationException. Конкретизируя одновременное поведение, я, очевидно, нуждаюсь в том, чтобы все изменения были видны после последующих чтений и итераторов.
Итератору не нужно показывать согласованный снимок, он может или не может видеть обновления через set(int index, E element), поскольку эта операция используется только для замены элемента своей обновленной версией (содержащей некоторую дополнительную информацию, которая не имеет значения для пользователя итератора). Элементы полностью неизменяемы.
Я ясно сказал, почему CopyOnWriteArrayList не будет делать. ConcurrentLinkedQueue не может быть и речи, поскольку он не имеет индексированного доступа. Мне нужно всего несколько операций, а не полноценный ArrayList. Поэтому, если какой-либо java-параллельный вопрос, связанный с списком, является дубликатом этого вопроса, этого нет.