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