Какими коллекциями пользоваться в многопоточной среде?
Первый вариант – превратить в синхронизированную обычную коллекцию, вызвав соответствующий ее типу метод
Если работа с коллекцией состоит в основном из чтения, лучшая в плане производительности альтернатива –
Третий вариант – использование
• Неблокирующие хэш-таблицы
• Неблокирующие очереди
Первый вариант – превратить в синхронизированную обычную коллекцию, вызвав соответствующий ее типу метод
Collections.synchronized*()
. Самый общий и самый примитивный способ, создает обертку с синхронизацией всех операций с помощью synchronized
.Если работа с коллекцией состоит в основном из чтения, лучшая в плане производительности альтернатива –
CopyOnWriteArrayList
, и содержащий его в реализации CopyOnWriteArraySet
. Потокобезопасность достигается копированием внутреннего массива при любой модификации, оригинальный массив остается immutable
. Program order достигается модификатором volatile
на внутреннем массиве.Третий вариант – использование
Concurrent-коллекций
:• Неблокирующие хэш-таблицы
ConcurrentSkipListMap
, ConcurrentHashMap
и ConcurrentSkipListSet
(хэш-таблица в основе реализации)• Неблокирующие очереди
ConcurrentLinkedQueue
и ConcurrentLinkedDeque
• Большой набор различных блокирующих очередей