Выбор лучшего списка параллелизма в Java


мой пул потоков имеет фиксированное количество потоков. Эти потоки должны написать и читать из общего списка часто.

Итак, какая структура данных (лучше Список, должна быть без монитора) в java.util.concurrent пакет лучше всего в этом случае?

6 58

6 ответов:

лучше List

The толькоList реализации в java.util.concurrent и CopyOnWriteArrayList. Существует также возможность синхронизированного списка, как упоминает Трэвис Уэбб.

тем не менее, вы уверены, что вам это нужно, чтобы быть List? Есть намного больше вариантов для одновременного Queue s и MapS (и вы можете сделать SetС Map s), и эти структуры, как правило, имеют наибольший смысл для многих из них типы вещей, которые вы хотите сделать с общей структурой данных.

для очередей, у вас есть огромное количество вариантов и, что является наиболее подходящим зависит от того, как вы должны использовать это:

любую коллекцию Java могут быть сделаны, чтобы быть потокобезопасным, как так:

List newList = Collections.synchronizedList(oldList);

или создать совершенно новый потокобезопасный список:

List newList = Collections.synchronizedList(new ArrayList());

http://download.oracle.com/javase/6/docs/api/java/util/Collections.html#synchronizedList(java.util.List)

Если размер списка, если фиксированная, то вы можете использовать AtomicReferenceArray. Это позволит вам выполнять индексированные обновления в слот. Вы можете написать представление списка, если это необходимо.

вы можете посмотреть на ConcurrentDoublyLinkedList написано Дуг Леа на основе Пола Мартина "практический без блокировки двусвязный список". Он не реализует java.утиль.Интерфейс списка, но предлагает большинство методов, которые вы будете использовать в списке.

в соответствии с документацией:

параллельная реализация связанного списка Deque (двусторонняя очередь). Одновременная вставка, удаление и доступ операции выполняются безопасно через несколько нити. Итераторы являются слабо непротиворечивый, возвращая элементы, отражающие состояние дек В какой-то момент или с момента создания итератора. Они делай не throw ConcurrentModificationException, и может проводиться параллельно с другими операциями.

ConcurrentLinkedQueue использует очередь без блокировки (на основе более новой инструкция CAS).

Если set достаточно,ConcurrentSkipListSet может быть использован. (Его реализация основана на ConcurrentSkipListMap который реализует a пропустить.)

ожидаемая средняя стоимость времени-log (n) для операций contains, add и remove; метод размера не является операцией с постоянным временем.