2017-07-29 15 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

相關問題