Использовать реализацию синхронизированного или одновременного списка вместо ArrayList
, например
Последний не список, но полезен, если вам на самом деле не нужен доступ -by-index (т. е. произвольный доступ), поскольку он работает лучше, чем другие.
Обратите внимание, поскольку вам, вероятно, потребуется одновременная вставка исходного пустого списка в карту для нового ключа, вам следует используйте ConcurrentHashMap
для самого Map
вместо простого HashMap
.
Рекомендация
Map<String, Deque<String>> myMap = new ConcurrentHashMap<>();
// Add new key/value pair
String key = "catKey";
String value = "catValue1";
myMap.computeIfAbsent(key, k -> new ConcurrentLinkedDeque<>()).add(value);
Приведенный выше код является полностью поточно-ориентированным при добавлении нового ключа на карту и полностью поточно-ориентированным при добавлении нового значения в список. Код не тратит время на получение блокировок синхронизации и не испытывает ухудшения, которое имеет CopyOnWriteArrayList
при увеличении списка.
Единственная проблема заключается в том, что он использует Deque
, а не List
, но реальность такова, что в большинстве случаев List
можно с легкостью использовать Deque
, но указывается List
по привычке, так что это, вероятно, приемлемое изменение.