Выбор лучшего списка параллелизма в Java
мой пул потоков имеет фиксированное количество потоков. Эти потоки должны написать и читать из общего списка часто.
Итак, какая структура данных (лучше Список, должна быть без монитора) в java.util.concurrent
пакет лучше всего в этом случае?
6 ответов:
лучше
List
The только
List
реализации вjava.util.concurrent
и CopyOnWriteArrayList. Существует также возможность синхронизированного списка, как упоминает Трэвис Уэбб.тем не менее, вы уверены, что вам это нужно, чтобы быть
List
? Есть намного больше вариантов для одновременногоQueue
s иMap
S (и вы можете сделатьSet
СMap
s), и эти структуры, как правило, имеют наибольший смысл для многих из них типы вещей, которые вы хотите сделать с общей структурой данных.для очередей, у вас есть огромное количество вариантов и, что является наиболее подходящим зависит от того, как вы должны использовать это:
любую коллекцию Java могут быть сделаны, чтобы быть потокобезопасным, как так:
List newList = Collections.synchronizedList(oldList);
или создать совершенно новый потокобезопасный список:
List newList = Collections.synchronizedList(new ArrayList());
Если размер списка, если фиксированная, то вы можете использовать AtomicReferenceArray. Это позволит вам выполнять индексированные обновления в слот. Вы можете написать представление списка, если это необходимо.
вы можете посмотреть на ConcurrentDoublyLinkedList написано Дуг Леа на основе Пола Мартина "практический без блокировки двусвязный список". Он не реализует java.утиль.Интерфейс списка, но предлагает большинство методов, которые вы будете использовать в списке.
в соответствии с документацией:
параллельная реализация связанного списка Deque (двусторонняя очередь). Одновременная вставка, удаление и доступ операции выполняются безопасно через несколько нити. Итераторы являются слабо непротиворечивый, возвращая элементы, отражающие состояние дек В какой-то момент или с момента создания итератора. Они делай не throw ConcurrentModificationException, и может проводиться параллельно с другими операциями.
ConcurrentLinkedQueue
использует очередь без блокировки (на основе более новой инструкция CAS).
Если set достаточно,ConcurrentSkipListSet может быть использован. (Его реализация основана на ConcurrentSkipListMap который реализует a пропустить.)
ожидаемая средняя стоимость времени-log (n) для операций contains, add и remove; метод размера не является операцией с постоянным временем.