Я объединяю несколько значений для ключей в многопоточной среде. Эти ключи не известны заранее. Я думал, что сделаю что-то вроде этого:
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, который затем выкидываю (в большинстве случаев). Это кажется необоснованным злоупотреблением сборщиком мусора. Есть ли лучший, потокобезопасный способ инициализации такого типа структуры без использования synchronize метода record? Я несколько удивлен решением о том, чтобы метод putIfAbsent не возвращал вновь созданный элемент, а также отсутствовал способ отложить экземпляр, если он не вызван (так сказать).