[Java] 为什么没有针对ConcurrentHashMap的ConcurrentHashSet



Answers

Set<String> mySet = Collections.newSetFromMap(new ConcurrentHashMap<String, Boolean>());
Question

HashSet基于HashMap。

如果我们看一下HashSet<E>实现,所有东西都在HashMap<E,Object>下进行管理。

<E>被用作HashMap的关键字。

我们知道HashMap不是线程安全的。 这就是为什么我们有Java中的ConcurrentHashMap

基于此,我很困惑, 为什么我们没有一个ConcurrentHashSet应该基于ConcurrentHashMap

还有什么我失踪? 我需要在多线程环境中使用Set

另外,如果我想创建自己的ConcurrentHashSet ,我可以通过将HashMap替换为ConcurrentHashMap并将剩下的部分保持原样来实现它?




就像Ray Toal所说的那样:

Set<String> myConcurrentSet = ConcurrentHashMap.newKeySet();



import java.util.AbstractSet;
import java.util.Iterator;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;


public class ConcurrentHashSet<E> extends AbstractSet<E> implements Set<E>{
   private final ConcurrentMap<E, Object> theMap;

   private static final Object dummy = new Object();

   public ConcurrentHashSet(){
      theMap = new ConcurrentHashMap<E, Object>();
   }

   @Override
   public int size() {
      return theMap.size();
   }

   @Override
   public Iterator<E> iterator(){
      return theMap.keySet().iterator();
   }

   @Override
   public boolean isEmpty(){
      return theMap.isEmpty();
   }

   @Override
   public boolean add(final E o){
      return theMap.put(o, ConcurrentHashSet.dummy) == null;
   }

   @Override
   public boolean contains(final Object o){
      return theMap.containsKey(o);
   }

   @Override
   public void clear(){
      theMap.clear();
   }

   @Override
   public boolean remove(final Object o){
      return theMap.remove(o) == ConcurrentHashSet.dummy;
   }

   public boolean addIfAbsent(final E o){
      Object obj = theMap.putIfAbsent(o, ConcurrentHashSet.dummy);
      return obj == null;
   }
}






Links