1) CopyOnWriteArraySet
एक काफी सरल कार्यान्वयन है - इसमें मूल रूप से एक सरणी में तत्वों की एक सूची है, और जब सूची बदलते हैं, तो यह सरणी को कॉपी करता है। पाठकों और लेखकों के बीच तुल्यकालन की आवश्यकता से बचने के बावजूद, इस समय चल रहे Iterations और अन्य एक्सेस पुराने सरणी के साथ जारी हैं (हालांकि लेखन को खुद को सिंक्रनाइज़ करने की आवश्यकता है)। सामान्य रूप से तेजी से सेट ऑपरेशन (विशेष रूप से contains()
) यहां काफी धीमा हैं, क्योंकि सरणियों को रैखिक समय में खोजा जाएगा।
इसे केवल वास्तव में छोटे सेटों के लिए उपयोग करें, जो अक्सर (पुनरावृत्त) पढ़ा जाएगा और शायद ही कभी बदल जाएगा। (स्विंगर्स श्रोता-सेट एक उदाहरण होगा, लेकिन ये वास्तव में सेट नहीं हैं, और इसका उपयोग केवल EDT से किया जाना चाहिए)
2) Collections.synchronizedSet
बस मूल सेट के प्रत्येक विधि के चारों ओर एक सिंक्रनाइज़-ब्लॉक लपेटेंगे। आपको सीधे मूल सेट का उपयोग नहीं करना चाहिए। इसका मतलब यह है कि सेट के किसी भी दो तरीकों को समवर्ती रूप से निष्पादित नहीं किया जा सकता है (एक दूसरे को समाप्त होने तक ब्लॉक करेगा) - यह थ्रेड-सुरक्षित है, लेकिन अगर आपके पास कई थ्रेड वास्तव में सेट का उपयोग कर रहे हैं, तो आपके पास समवर्ती नहीं होगा। यदि आप इटरेटर का उपयोग करते हैं, तो आपको आमतौर पर इटर्टर कॉल के बीच सेट को संशोधित करते समय समवर्तीModificationException से बचने के लिए बाह्य रूप से सिंक्रनाइज़ करने की आवश्यकता होती है। प्रदर्शन मूल सेट के प्रदर्शन की तरह होगा (लेकिन कुछ सिंक्रनाइज़ेशन ओवरहेड के साथ, और यदि समवर्ती रूप से उपयोग किया जाता है तो अवरुद्ध होता है)।
इसका उपयोग करें यदि आपके पास केवल कम संगामिति है, और यह सुनिश्चित करना चाहते हैं कि सभी परिवर्तन तुरंत अन्य थ्रेड्स को दिखाई दें।
3) ConcurrentSkipListSet
समवर्ती SortedSet
कार्यान्वयन है, जिसमें ओ (लॉग एन) में सबसे बुनियादी संचालन हैं। यह समवर्ती जोड़ने / हटाने और पढ़ने / पुनरावृत्ति की अनुमति देता है, जहां पुनरावृति इटेरेटर के निर्माण के बाद से परिवर्तनों के बारे में बता सकता है या नहीं बता सकता है। बल्क ऑपरेशन्स केवल एक सिंगल कॉल हैं, और एटोमिक रूप से नहीं - अन्य थ्रेड्स उनमें से कुछ का ही अवलोकन कर सकते हैं।
जाहिर है आप इसका उपयोग केवल तभी कर सकते हैं जब आपके पास अपने तत्वों पर कुछ कुल आदेश हो। यह उच्च-संगामिति स्थितियों के लिए एक आदर्श उम्मीदवार की तरह दिखता है, न कि बहुत बड़े सेट (ओ (लॉग एन) के कारण) के लिए।
4) ConcurrentHashMap
(और इससे प्राप्त सेट) के लिए: यहाँ सबसे बुनियादी विकल्प हैं (औसतन, यदि आपके पास एक अच्छा और तेज़ है hashCode()
) तो O (1) में (लेकिन O (n) को पतित कर सकते हैं), जैसे HashMap / HashSet। लिखने के लिए एक सीमित संगोष्ठी है (तालिका का विभाजन किया गया है, और लिखने की पहुंच आवश्यक विभाजन पर सिंक्रनाइज़ की जाएगी), जबकि रीड एक्सेस पूरी तरह से स्वयं और लेखन थ्रेड्स के समवर्ती है (लेकिन अभी तक हो रहे परिवर्तनों के परिणाम नहीं देख सकते हैं। लिखित)। इट्रेटर तब से बदलावों को देख सकता है या नहीं देख सकता है जब से इसे बनाया गया था, और थोक संचालन परमाणु नहीं हैं। आकार बदलना धीमा है (HashMap / HashSet के लिए), इस प्रकार निर्माण पर आवश्यक आकार का आकलन करके इससे बचने की कोशिश करें (और इसका 1/3 अधिक उपयोग करें, क्योंकि यह आकार 3/4 पूर्ण होने पर)।
जब आपके पास बड़े सेट हों, तो एक अच्छा (और तेज़) हैश फ़ंक्शन का उपयोग करें और मानचित्र बनाने से पहले सेट आकार और आवश्यक संगामिति का अनुमान लगा सकते हैं।
5) क्या अन्य समवर्ती मानचित्र कार्यान्वयन यहां उपयोग किए जा सकते हैं?