Параллельные массивы в Java
Итак, в Java существует параллельный хэш файл, преимущество которого заключается не в том, чтобы заблокировать всю хэш-таблицу, а только ее части. Мне было интересно, была ли такая конструкция для массивов. В частности, при изменении размера массива блокировка всего массива нежелательна, особенно в приложениях реального времени. Что-нибудь там?
Ответы
Ответ 1
Java 6 также добавляет интересную коллекцию, называемую ConcurrentSkipListSet
... средняя log (n) временная стоимость для contains, add
и remove
и их варианты. Операции вставки, удаления и доступа безопасно выполняются одновременно несколькими потоками. Итераторы слабо согласованы, возвращая элементы, отражающие состояние множества в какой-либо точке на или после создания итератора. Они не бросают ConcurrentModificationException и могут продолжаться одновременно с другими операциями...
Ответ 2
Существует AtomicIntegerArray
(и аналогичный AtomicReferenceArray
), который может соответствовать вашему описанию. Но, как заметил Марсело, вы не можете изменять размеры массивов. Таким образом, вы получаете только одновременную безопасность без необходимости явного блокирования всего массива.
Массив... в котором элементы могут обновляться атомарно
Ответ 3
Вы всегда можете использовать один из них:
-
java.util.Collections.synchronizedList(List<T> list)
-
java.util.Collections.synchronizedCollection(Collection<T> collection)
-
java.util.Collections.synchronizedSet(Set<T> set)
Ваши требования не ясны. Возможно, будет выполнен и список java.util.collections для копирования или записи.
Ответ 4
Ближайшей частью стандартной библиотеки является CopyOnWriteArrayList. Это "одновременное" в том смысле, что для читателей нет блокировки и, следовательно, не противоречия; однако доступ для писателей сериализуется и очень дорог. Компромисс немного острее, чем для одновременного hashmap: чтение действительно дешево, но записи действительно дороги.
Кажется, что можно было бы написать реализацию списка, которая использовала стратегию striped lock для одновременного hashmap для одноэлементных операций сохранения размера, таких как get
и set
(и, возможно, add
для конец списка), но стратегия копирования на запись для операций изменения размера, таких как add
и remove
. Однако было бы довольно сложно получить разумное упорядочение мутаций, сохраняющих размер и изменение размеров.