जावा में असफल-सुरक्षित और असफल-तेज़ Iterators क्या हैं


101

जावा में दो प्रकार के पुनरावृत्त हैं: असफल-सुरक्षित और असफल-तेज़।

इसका क्या मतलब है, और क्या उनके बीच अंतर है?


3
सबसे अच्छा लिंक मुझे मिला javahungry.blogspot.com/2014/04/…
प्रेमराज

2
ध्यान दें कि जावा एसई विनिर्देश किसी भी पुनरावृत्तियों का वर्णन करने के लिए "असफल-सुरक्षित" शब्द का उपयोग नहीं करते हैं। मैं इस प्रकार इस शब्द से बचने की सलाह देता हूं। इन्हें भी देखें stackoverflow.com/a/38341921/1441122
स्टुअर्ट मार्क्स

जवाबों:


84

उनके बीच क्या अंतर है ...

"असफल-सुरक्षित" ( इंजीनियरिंग में ) का अर्थ है कि कुछ इस तरह से विफल हो जाता है जिससे कोई नुकसान न हो या कम से कम नुकसान हो। कड़ाई से कहे तो जावा में एक असफल-सुरक्षित पुनरावृत्तिकर्ता जैसी कोई चीज नहीं है। यदि एक पुनरावृत्त विफल रहता है ("विफल" के सामान्य अर्थ में), तो आप नुकसान होने की उम्मीद कर सकते हैं।

मुझे संदेह है कि आप वास्तव में "कमजोर संगत" पुनरावृत्तियों का मतलब है। जावदोक कहता है:

"अधिकांश समवर्ती संग्रह कार्यान्वयन (अधिकांश कतार सहित) भी सामान्य java.util सम्मेलनों से भिन्न होते हैं, जिसमें उनके Iterators और Spliterators तेजी से विफल ट्रैवर्सल के बजाय कमजोर रूप से सुसंगत प्रदान करते हैं।"

आमतौर पर, कमजोर संगति का मतलब है कि अगर संग्रह को पुनरावृति के साथ समवर्ती रूप से संशोधित किया जाता है, तो पुनरावृत्ति जो देखता है उसकी गारंटी कमजोर है। (विवरण प्रत्येक समवर्ती संग्रह कक्षाओं javadocs में निर्दिष्ट किया जाएगा।)

"फेल-फास्ट" ( सिस्टम डिजाइन में ) का मतलब है कि विफलता की स्थिति को आक्रामक रूप से जांचा जाता है ताकि विफलता की स्थिति (जहां संभव हो 1 ) का पता लगाया जा सके इससे पहले कि बहुत अधिक नुकसान हो सके। जावा में, फेल-फास्ट इटेरेटर फेल होने से फेल हो जाता है ConcurrentModificationException

"असफल-तेज" और "कमजोर रूप से सुसंगत" का विकल्प अर्थ है जहां पुनरावृत्ति अप्रत्याशित रूप से विफल होती है; कभी-कभी गलत उत्तर देने या अप्रत्याशित अपवाद को फेंकने के लिए। (यह Enumerationजावा के शुरुआती संस्करणों में एपीआई के कुछ मानक कार्यान्वयन का व्यवहार था ।)

... और क्या वे उस संग्रहक से अलग हैं जिसे हम संग्रह के लिए उपयोग करते हैं।

नहीं। ये मानक संग्रह प्रकारों द्वारा कार्यान्वित पुनरावृत्तियों के गुण हैं ; यानी वे या तो "तेजी से विफल" या "कमजोर रूप से सुसंगत" हैं ... जब सिंक्रनाइज़ेशन और जावा मेमोरी मॉडल 1 के संबंध में सही तरीके से उपयोग किया जाता है ।


असफल-तेज़ पुनरावृत्तियों को आमतौरvolatile पर संग्रह ऑब्जेक्ट पर एक काउंटर का उपयोग करके लागू किया जाता है ।

  • जब संग्रह को अपडेट किया जाता है, तो काउंटर बढ़ जाता है।
  • जब एक Iteratorबनाया जाता है, तो काउंटर का वर्तमान मूल्य Iteratorऑब्जेक्ट में एम्बेडेड होता है ।
  • जब कोई Iteratorऑपरेशन किया जाता है, तो विधि दो काउंटर मानों की तुलना करती है और यदि वे भिन्न होते हैं तो एक सीएमई फेंकता है।

इसके विपरीत, कमजोर रूप से सुसंगत पुनरावृत्तियां आमतौर पर प्रत्येक समवर्ती संग्रह की आंतरिक डेटा संरचनाओं के हल्के वजन और उत्तोलन गुण होती हैं। कोई सामान्य पैटर्न नहीं है। यदि आप रुचि रखते हैं, तो विभिन्न संग्रह कक्षाओं के लिए स्रोत कोड पढ़ें।


1 - राइडर यह है कि असफल-फास्ट व्यवहार मानता है कि सिंक्रनाइज़ेशन और मेमोरी मॉडल के संबंध में एप्लिकेशन आईडी सही ढंग से है। इसका मतलब है कि (उदाहरण के लिए) यदि आप ArrayListउचित सिंक्रनाइज़ेशन के बिना पुनरावृति करते हैं , तो परिणाम एक दूषित सूची परिणाम हो सकता है। "तेज विफल" तंत्र संभवतः समवर्ती संशोधन का पता लगाएगा (हालांकि इसकी गारंटी नहीं है), लेकिन यह अंतर्निहित भ्रष्टाचार का पता नहीं लगाएगा। एक उदाहरण के रूप में, javadoc के लिए Vector.iterator()यह कहते हैं:

"एक इट्रेटर के असफल-तेज़ व्यवहार की गारंटी नहीं दी जा सकती क्योंकि यह आम तौर पर बोल रहा है, असंबद्ध समवर्ती संशोधन की उपस्थिति में कोई कठिन गारंटी देना असंभव है। फेल-फास्ट पुनरावृत्तियों ConcurrentModificationExceptionने एक सर्वोत्तम प्रयास के आधार पर फेंक दिया। इसलिए, यह होगा। एक प्रोग्राम लिखने के लिए गलत है जो इसके सही होने के लिए इस अपवाद पर निर्भर करता है: बग का पता लगाने के लिए पुनरावृत्तियों के असफल-तेज़ व्यवहार का उपयोग किया जाना चाहिए। "


शायद थोड़ा अप्रासंगिक हो लेकिन इस प्रश्न के लिए पूरक भी हो सकता है। उदाहरण के लिए, सीओडब्ल्यू द्वारा उपयोग की जाने वाली स्नैपशॉट शैली के बारे में क्या? अधिक विशेष रूप से, मुझे यह बिल्कुल नहीं मिलता कि अंतर्निहित सरणी (या स्नैपशॉट) जो CoW पुनरावृत्ति "कभी नहीं" से पुनरावृत्ति करता है, जो अन्य थ्रेड्स द्वारा किए गए किसी भी परिवर्तन को देखता है क्योंकि हम अभी भी setArrayकिसी भी संशोधन पर कॉल करने में सक्षम हैं ।
stdout

मैंने तय किया कि कमजोर सुसंगत पुनरावृत्तियों के कार्यान्वयन के बारे में बात करना इस प्रश्नोत्तर के दायरे से बाहर है।
स्टीफन सी

42

वे बल्कि असफल-तेज़ और कमजोर-संगत प्रकार हैं:

यदि संग्रह करते समय संग्रह के तरीकों (जोड़ / हटाएं) द्वारा संशोधित किया गया था, तो java.utilपैकेज थ्रो से IteratorsConcurrentModificationException

java.util.concurrentपैकेज से Iterators आम तौर पर स्नैपशॉट पर पुनरावृति करते हैं और समवर्ती संशोधनों की अनुमति देते हैं, लेकिन पुनरावृत्ति के बाद संग्रह अपडेट को प्रतिबिंबित नहीं कर सकते हैं।


Iterator असफल-तेज़ का उदाहरण है, जबकि गणन विफल-सुरक्षित है
अजय शर्मा

5
@ अजयशर्मा - दो मायने में गलत। 1) न तो Iteratorया Enumerationअसफल-तेज या असफल-सुरक्षित के रूप में व्यवहार निर्दिष्ट। यह विशिष्ट कार्यान्वयन है (यानी विशिष्ट संग्रह iterator()/ elements()आदि तरीके जो इन वस्तुओं को वापस करते हैं) जो व्यवहार को निर्दिष्ट करते हैं। 2) विशिष्ट गणन कार्यान्वयन न तो तेजी से विफल होते हैं और न ही सुरक्षित होते हैं
स्टीफन सी

22

एकमात्र अंतर विफल-सुरक्षित पुनरावृत्ति है कोई भी अपवाद नहीं फेंकता है, विफल-फास्ट Iterator के विपरीत।

यदि संग्रह संरचनात्मक रूप से संशोधित किया गया है, जबकि एक धागा इसके ऊपर पुनरावृत्त कर रहा है। ऐसा इसलिए है क्योंकि वे मूल संग्रह के बजाय संग्रह के क्लोन पर काम करते हैं और इसीलिए उन्हें असफल-सुरक्षित पुनरावृत्तिकर्ता कहा जाता है।

CopyOnWriteArrayList का Iterator असफल-सुरक्षित Iterator का एक उदाहरण है, जिसे ConcurrentHashMap keySet द्वारा लिखा गया itter भी विफल-सुरक्षित पुनरावृत्त है और कभी भी Java में ConcurrentModificationException नहीं फेंकता है।


मैं नहीं देखता हूं कि समवर्ती हाशपाटर इटैलर क्लोन पर काम कर रहा है (..) :( कुछ समय यह पुनरावृति करते समय कुछ अपडेट को प्रतिबिंबित करेगा ..
कनागावेलु सुगुमार

0

यह परिदृश्य "समवर्ती प्रसंस्करण" के साथ संबंधित है, इसका मतलब है कि तब एक ही उपयोगकर्ता एक ही संसाधन का उपयोग कर रहा है। ऐसी स्थिति में, उपयोगकर्ता में से कोई भी उस संसाधन को संशोधित करने का प्रयास करता है, जो 'ConcurrentProcessingException' का कारण बनता है क्योंकि उस स्थिति में अन्य उपयोगकर्ता को अनुचित डेटा मिलता है। यह दोनों प्रकार इस तरह की स्थिति से संबंधित हैं।

सरल शब्द में,

विफल-उपवास:

  • यदि संरचनात्मक संशोधन (जोड़, अद्यतन, हटाएं) होता है तो Iterators तुरंत ConcurrentModificationException को फेंक देते हैं।
  • उदाहरण: ArrayList, HashMap, TreeSet

सुरक्षा कम होना :

  • यहां Iterators किसी अपवाद को नहीं फेंकते क्योंकि वे संग्रह के क्लोन पर काम करते हैं, मूल नहीं। ताकि, वे असफल-सुरक्षित चलने वाले हों।
  • उदाहरण: CopyOnWriteArrayList, ConcurrentHashMap
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.