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