Параллельные массивы в Java - PullRequest
16 голосов
/ 25 июля 2011

Итак, в Java существует одновременная хэш-карта , преимущество которой состоит не в блокировке всей хеш-таблицы, а только ее части. Мне было интересно, была ли такая конструкция для массивов. В частности, когда размер массива изменяется, блокировка всего массива нежелательна, особенно в приложениях реального времени. Что-нибудь там?

Ответы [ 4 ]

17 голосов
/ 25 июля 2011

Существует AtomicIntegerArray (и аналогичные AtomicReferenceArray), которые могут соответствовать вашему описанию. Но, как отметил Марсело, вы не можете изменять размеры массивов. Таким образом, вы получаете только одновременную безопасность без необходимости явной блокировки (включения) всего массива.

Массив ..., в котором элементы могут обновляться атомарно

7 голосов
/ 26 июля 2011

Java 6 также добавляет интересную коллекцию под названием ConcurrentSkipListSet

... средний log (n) затраты времени на операции contains, add, remove и их варианты. Операции вставки, удаления и доступа безопасно выполняются одновременно несколькими потоками. Итераторы слабо согласованы , возвращая элементы, отражающие состояние множества в некоторой точке во время или после создания итератора. Они не генерируют исключение ConcurrentModificationException и могут работать одновременно с другими операциями ...
4 голосов
/ 26 июля 2011

Самая близкая вещь в стандартной библиотеке - CopyOnWriteArrayList .Это «одновременно» в том смысле, что для читателей нет блокировки и, следовательно, нет конкуренции;однако доступ для авторов сериализуется и стоит очень дорого.Компромисс немного острее, чем для одновременной хэш-карты: чтение действительно дешево, но запись действительно дорого.

Кажется, что можно написать реализацию списка, в которой использовалась бы стратегия одновременной блокировки с чередованиемhashmap для одноэлементных операций сохранения размера, таких как get и set (и, возможно, add до конца списка), но стратегия копирования при записи для операций изменения размера, таких как add иremove.Впрочем, может быть довольно сложно получить разумный порядок сохраняющих размер и изменяющих размер мутаций.

4 голосов
/ 25 июля 2011

Вы всегда можете использовать один из них:

  1. java.util.Collections.synchronizedList(List<T> list)
  2. java.util.Collections.synchronizedCollection(Collection<T> collection)
  3. java.util.Collections.synchronizedSet(Set<T> set)

Ваши требования не ясны. Возможно, подойдет список или набор java.util.collections для копирования и записи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...