мне нужен ArrayList-подобную структуру, позволяющую только следующие операцииПараллельное ArrayList
get(int index)
add(E element)
set(int index, E element)
iterator()
Из итератора используется во многих мест, используя Collections#synchronizedList
wo uld слишком подвержен ошибкам. Список может вырасти до нескольких тысяч элементов и будет использоваться много, поэтому я уверен, что CopyOnWriteArrayList
будет слишком медленным. Я начну с этого, чтобы избежать преждевременных оптимизаций, но я бы поспорил, что это не сработает.
Большинство доступов будут однопоточными. Поэтому я спрашиваю, какова правильная структура данных для этого.
я хоть что обертывание synchronizedList
в чем-то обеспечивая синхронизированный итератор будет делать, но он не будет из-за ConcurrentModificationException
. Конкретизируя одновременное поведение, я, очевидно, нуждаюсь в том, чтобы все изменения были видны после последующих чтений и итераторов.
Итератору не нужно показывать согласованный снимок, он может или не может видеть обновления через set(int index, E element)
, так как эта операция используется только для замены элемента своей обновленной версией (содержащей некоторую дополнительную информацию, которая не имеет значения для пользователь итератора). Элементы полностью неизменяемы.
Я четко заявил, почему CopyOnWriteArrayList
не сделал. ConcurrentLinkedQueue
не может быть отказано в индексированном доступе. Мне нужно всего несколько операций, а не полноценный ArrayList
. Таким образом, если любой связанный со списком java вопрос является дубликатом this question, этого нет.
Вы можете попробовать Clojure-х [ 'PersistentVector'] (https://github.com/clojure/clojure/blob/master/src/jvm/ clojure/lang/PersistentVector.java), это также копирование на запись, но не наивный монолитный массив; а скорее широкое и неглубокое дерево массивов. В конце исходного кода, на который я ссылаюсь, вы найдете тестовый код. –
@skaffman Не могли бы вы прочитать вопрос до его закрытия? См. Мое обновление. – maaartinus
@MarkoTopolnik Это сработает, но код выглядит очень странно. Это также добавляет некоторые накладные расходы, необходимые для операций, которые мне не нужны. Кстати, не могли бы вы проголосовать за повторное открытие? IMHO мода была слишком быстрой с чтением. – maaartinus