दिलचस्प पोस्ट
मैं 2 अंकों के प्रारूप में महीने और जावास्क्रिप्ट की तारीख कैसे प्राप्त करूं? बिना आकार () क्या करता है? धाराप्रवाह एपीआई के साथ अद्वितीय प्रतिबंध सेट? MySQL में पदानुक्रमित क्वेरी टेक्स्ट या एनटेक्स्ट डेटाटाइप पर जगह देने के विकल्प स्ट्रिंग सीमांकक (मानक C ++) का उपयोग करके पार्स (विभाजन) सी ++ में एक स्ट्रिंग कोणीयफायर 2 डेटाबेस में शामिल होने के लिए कैसे करें एंड्रॉइड डिवाइस की धारावाहिक संख्या कैसे प्राप्त करें? जावा की छुपी हुई विशेषताएं "रिक्त या शून्य मान" की जांच करने का सर्वोत्तम तरीका जावा जेवीएम स्टार्टअप पैरामीटर पढ़ें (जैसे- एक्सएमएक्स) पीएचपी में बिट्स ऑपरेशन? जावास्क्रिप्ट के साथ एक छवि की असली चौड़ाई और ऊंचाई प्राप्त करें? (सफारी / क्रोम में) सॉकेट ट्रांसपोर्ट "एसएसएल" PHP में सक्षम नहीं है क्या अस्थिर महंगा है?

समवर्ती हैशमैप के खिलाफ कोई समवर्ती HashSet क्यों नहीं है

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

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

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

और हम जानते हैं कि HashMap धागा सुरक्षित नहीं है यही कारण है कि हम जावा में ConcurrentHashMap है

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

क्या मुझे कुछ याद आ रही है? मुझे बहु-थ्रेडेड परिवेश में Set का उपयोग करने की आवश्यकता है I

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

वेब के समाधान से एकत्रित समाधान "समवर्ती हैशमैप के खिलाफ कोई समवर्ती HashSet क्यों नहीं है"

ConcurrentHashSet लिए कोई भी प्रकार में निर्मित नहीं है, क्योंकि आप हमेशा किसी मानचित्र से एक सेट प्राप्त कर सकते हैं। चूंकि कई प्रकार के नक्शे हैं, इसलिए आप किसी दिए गए मानचित्र (या मानचित्र वर्ग) से एक सेट का निर्माण करने के लिए एक विधि का उपयोग करते हैं।

जावा 8 से पहले, आप एक समवर्ती हैश का निर्माण करते हैं जो कलेक्शन.न्यूसैटफ्रेम मानचित्र Collections.newSetFromMap(map) का उपयोग करके एक समवर्ती हैश मैप द्वारा समर्थित है।

जावा 8 में (@ मैट द्वारा इंगित किया गया), आप समवर्ती ConcurrentHashMap.newKeySet() द्वारा ConcurrentHashMap.newKeySet() हैश सेट दृश्य प्राप्त कर सकते हैं। यह पुराने newSetFromMap तुलना में थोड़ा आसान है, जिसके लिए आपको एक खाली नक्शा ऑब्जेक्ट में पास करना होगा। लेकिन यह ConcurrentHashMap लिए विशिष्ट है।

वैसे भी, जावा डिजाइनर हर बार जब एक नया मानचित्र इंटरफ़ेस बनाया गया था, तो एक नया सेट इंटरफ़ेस बनाया हो सकता था, लेकिन ऐसा प्रतीत होता है जब तीसरे पक्ष अपने स्वयं के मानचित्र बनाते हैं नए सेट प्राप्त करने वाले स्थिर तरीकों को बेहतर करना; यह दृष्टिकोण हमेशा काम करता है, तब भी जब आप अपना स्वयं का नक्शा कार्यान्वयन बनाते हैं

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

गवावा 15 के साथ आप इसका उपयोग भी कर सकते हैं:

 Set s = Sets.newConcurrentHashSet(); 

ऐसा लगता है कि जावा अपने समवर्ती एसकिपलिस्टसेट के साथ एक समवर्ती सेट कार्यान्वयन प्रदान करता है एक SkipList सेट सिर्फ एक विशेष प्रकार का सेट कार्यान्वयन है यह अभी भी सीरियलिज़ेबल, क्लेनेबल, इटेरेबल, कलेक्शन, नेविगेटसेट, सेट, सॉर्टेडसेट इंटरफेस को लागू करता है। यह आपके लिए काम कर सकता है यदि आपको केवल सेट इंटरफ़ेस की आवश्यकता है

आप एक पाने के लिए अमरूद के Sets.newSetFromMap(map) का उपयोग कर सकते हैं। जावा 6 में भी ऐसा तरीका है जो java.util.Collections

जैसा कि एक संगामी सक्षम HashSet प्राप्त करने का सबसे अच्छा तरीका यह है कि Collections.synchronizedSet() माध्यम से होता है। सिंक्रनाइज़सेट Collections.synchronizedSet()

 Set s = Collections.synchronizedSet(new HashSet(...)); 

यह मेरे लिए काम किया है और मैंने किसी को वास्तव में यह इंगित नहीं किया है।

संपादित करें यूजिन बताते हैं, चूंकि यह एक सिंक्रनाइज़ डेकोरेटर में आपका सेट लपेटता है, जबकि एक ConcurrentHashMap वास्तव में कम-स्तरीय संगामिति को लागू करता है और यह आपके सेट को ठीक तरह से ठीक कर सकता है। इतना स्पष्ट करने के लिए श्री स्टेपनेंकोव के लिए धन्यवाद।

http://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#synchronizedSet-java.util.Set-

रे तोल की तरह भी उतना ही आसान है जैसे:

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

क्यों नहीं उपयोग करें: CopyOnWriteArraySet java.util.concurrent से सेट करें?