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