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
synchronize
record
putIfAbsent