[Java] ConcurrentHashMap के खिलाफ कोई ConcurrentHashSet क्यों नहीं है


Answers

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

हैशसेट हैश मैप पर आधारित है।

यदि हम HashSet<E> कार्यान्वयन को देखते हैं, तो सब कुछ HashMap<E,Object> अंतर्गत प्रबंधित किया गया है।

<E> HashMap कुंजी के रूप में प्रयोग किया जाता है।

और हम जानते हैं कि HashMap थ्रेड सुरक्षित नहीं है। यही कारण है कि हमारे पास जावा में ConcurrentHashMap है।

इस पर आधारित, मैं उलझन में हूं कि हमारे पास ConcurrentHashSet क्यों नहीं है जो ConcurrentHashMap पर आधारित होना चाहिए?

क्या कोई और चीज है जो मुझे याद आ रही है? मुझे एक बहु थ्रेडेड वातावरण में Set का उपयोग करने की आवश्यकता है।

इसके अलावा, अगर मैं अपना स्वयं का ConcurrentHashSet बनाना चाहता हूं, तो क्या मैं इसे HashMap को ConcurrentHashMap बदलकर और शेष को छोड़कर प्राप्त कर सकता हूं?




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;
   }
}



ऐसा लगता है कि जावा इसके docs.oracle.com/javase/7/docs/api/java/util/concurrent/… साथ एक समवर्ती सेट कार्यान्वयन प्रदान करता है। एक SkipList सेट बस एक विशेष प्रकार का सेट कार्यान्वयन है। यह अभी भी Serializable, Cloneable, Iterable, संग्रह, NavigableSet, सेट, SortedSet इंटरफेस लागू करता है। यदि आपको केवल सेट इंटरफ़ेस की आवश्यकता है तो यह आपके लिए काम कर सकता है।




रे टोल की तरह उल्लेख किया गया है कि यह उतना आसान है जितना:

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