2017-07-29 18 views
1

我有一个java.util.concurrent.ConcurrentHashMap,我想如果它不存在,但如果有东西存在,我想也删除它。例如:ConcurrentHashMap#putIfAbsent但删除项目如果存在

ConcurrentHashMap<K, V> map = new ConcurrentHashMap<>(); 
// ... 
V value = map.putIfAbsent(k, new V(/* ... */)); 
if (value != null) { 
    map.remove(k); 
} 

除了当然我希望它是线程安全的。

有没有干净的方法来做到这一点?或者我应该只使用HashMap并同步访问?

我的理解是,update operations are synchronized anyway,我不希望有显着的锁争用,所以添加更多的同步并不是什么大不了的事。

回答

2

如果性能是不是一个问题,你可以使用装饰设计模式与ConcurrentHashMap,并添加同步如下:

public class MyMap<K, V> { 

    private ConcurrentHashMap<K, V> map; 

    public V put(K key, V value) { 
     synchronize(map) { 
      if(map.get(key) != null) { 
       map.remove(key); 
      } else { 
       map.put(key, value); 
     } 
    } 

    public V get(Object key) { 
     synchronize(map) { 
      return map.get(key); 
     } 
    } 
} 

如果性能是一个问题,你可以实现类似于实现的一个优化的实现在ConcurrentHashMap。为此,我建议你看看ConcurrentHashMapsource code

相关问题