Я агрегирую несколько значений для ключей в многопоточной среде. Ключи заранее не известны. Я думал, что сделаю что-то вроде этого:
class Aggregator {
protected ConcurrentHashMap<String, List<String>> entries =
new ConcurrentHashMap<String, List<String>>();
public Aggregator() {}
public void record(String key, String value) {
List<String> newList =
Collections.synchronizedList(new ArrayList<String>());
List<String> existingList = entries.putIfAbsent(key, newList);
List<String> values = existingList == null ? newList : existingList;
values.add(value);
}
}
Проблема, которую я вижу, заключается в том, что каждый раз, когда этот метод запускается, мне нужно создать новый экземпляр ArrayList
, который я затем выбрасываю (в большинстве случаев ). Это похоже на неоправданное злоупотребление сборщиком мусора. Есть ли лучший, потокобезопасный способ инициализации такого рода структуры без необходимости синхронизировать
метод записи
? Я несколько удивлен решением, что метод putIfAbsent
не возвращает вновь созданный элемент, и отсутствием способа отложить создание экземпляра, если он не требуется (так сказать).