ConcurrentHashMap: избежать создания дополнительных объектов с помощью «putIfAbsent»?

Я агрегирую несколько значений для ключей в многопоточной среде. Ключи заранее не известны. Я думал, что сделаю что-то вроде этого:

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

38
задан M. A. Kishawy 2 April 2015 в 14:04
поделиться