ConcurrentHashMap: avoid extra object creation with “putIfAbsent”?

后端 未结 7 2046
北海茫月
北海茫月 2020-12-12 19:10

I am aggregating multiple values for keys in a multi-threaded environment. The keys are not known in advance. I thought I would do something like this:

class         


        
7条回答
  •  春和景丽
    2020-12-12 20:12

    Created two versions based on Gene's answer

    public  static  void putIfAbsetMultiValue(ConcurrentHashMap> entries, K key, V value) {
        List values = entries.get(key);
        if (values == null) {
            values = Collections.synchronizedList(new ArrayList());
            List values2 = entries.putIfAbsent(key, values);
            if (values2 != null)
                values = values2;
        }
        values.add(value);
    }
    
    public  static  void putIfAbsetMultiValueSet(ConcurrentMap> entries, K key, V value) {
        Set values = entries.get(key);
        if (values == null) {
            values = Collections.synchronizedSet(new HashSet());
            Set values2 = entries.putIfAbsent(key, values);
            if (values2 != null)
                values = values2;
        }
        values.add(value);
    }
    

    It works well

提交回复
热议问题