जावा में दो प्रकार के पुनरावृत्त हैं: असफल-सुरक्षित और असफल-तेज़।
इसका क्या मतलब है, और क्या उनके बीच अंतर है?
जावा में दो प्रकार के पुनरावृत्त हैं: असफल-सुरक्षित और असफल-तेज़।
इसका क्या मतलब है, और क्या उनके बीच अंतर है?
जवाबों:
उनके बीच क्या अंतर है ...
"असफल-सुरक्षित" ( इंजीनियरिंग में ) का अर्थ है कि कुछ इस तरह से विफल हो जाता है जिससे कोई नुकसान न हो या कम से कम नुकसान हो। कड़ाई से कहे तो जावा में एक असफल-सुरक्षित पुनरावृत्तिकर्ता जैसी कोई चीज नहीं है। यदि एक पुनरावृत्त विफल रहता है ("विफल" के सामान्य अर्थ में), तो आप नुकसान होने की उम्मीद कर सकते हैं।
मुझे संदेह है कि आप वास्तव में "कमजोर संगत" पुनरावृत्तियों का मतलब है। जावदोक कहता है:
"अधिकांश समवर्ती संग्रह कार्यान्वयन (अधिकांश कतार सहित) भी सामान्य java.util सम्मेलनों से भिन्न होते हैं, जिसमें उनके Iterators और Spliterators तेजी से विफल ट्रैवर्सल के बजाय कमजोर रूप से सुसंगत प्रदान करते हैं।"
आमतौर पर, कमजोर संगति का मतलब है कि अगर संग्रह को पुनरावृति के साथ समवर्ती रूप से संशोधित किया जाता है, तो पुनरावृत्ति जो देखता है उसकी गारंटी कमजोर है। (विवरण प्रत्येक समवर्ती संग्रह कक्षाओं javadocs में निर्दिष्ट किया जाएगा।)
"फेल-फास्ट" ( सिस्टम डिजाइन में ) का मतलब है कि विफलता की स्थिति को आक्रामक रूप से जांचा जाता है ताकि विफलता की स्थिति (जहां संभव हो 1 ) का पता लगाया जा सके इससे पहले कि बहुत अधिक नुकसान हो सके। जावा में, फेल-फास्ट इटेरेटर फेल होने से फेल हो जाता है ConcurrentModificationException
।
"असफल-तेज" और "कमजोर रूप से सुसंगत" का विकल्प अर्थ है जहां पुनरावृत्ति अप्रत्याशित रूप से विफल होती है; कभी-कभी गलत उत्तर देने या अप्रत्याशित अपवाद को फेंकने के लिए। (यह Enumeration
जावा के शुरुआती संस्करणों में एपीआई के कुछ मानक कार्यान्वयन का व्यवहार था ।)
... और क्या वे उस संग्रहक से अलग हैं जिसे हम संग्रह के लिए उपयोग करते हैं।
नहीं। ये मानक संग्रह प्रकारों द्वारा कार्यान्वित पुनरावृत्तियों के गुण हैं ; यानी वे या तो "तेजी से विफल" या "कमजोर रूप से सुसंगत" हैं ... जब सिंक्रनाइज़ेशन और जावा मेमोरी मॉडल 1 के संबंध में सही तरीके से उपयोग किया जाता है ।
असफल-तेज़ पुनरावृत्तियों को आमतौरvolatile
पर संग्रह ऑब्जेक्ट पर एक काउंटर का उपयोग करके लागू किया जाता है ।
Iterator
बनाया जाता है, तो काउंटर का वर्तमान मूल्य Iterator
ऑब्जेक्ट में एम्बेडेड होता है ।Iterator
ऑपरेशन किया जाता है, तो विधि दो काउंटर मानों की तुलना करती है और यदि वे भिन्न होते हैं तो एक सीएमई फेंकता है।इसके विपरीत, कमजोर रूप से सुसंगत पुनरावृत्तियां आमतौर पर प्रत्येक समवर्ती संग्रह की आंतरिक डेटा संरचनाओं के हल्के वजन और उत्तोलन गुण होती हैं। कोई सामान्य पैटर्न नहीं है। यदि आप रुचि रखते हैं, तो विभिन्न संग्रह कक्षाओं के लिए स्रोत कोड पढ़ें।
1 - राइडर यह है कि असफल-फास्ट व्यवहार मानता है कि सिंक्रनाइज़ेशन और मेमोरी मॉडल के संबंध में एप्लिकेशन आईडी सही ढंग से है। इसका मतलब है कि (उदाहरण के लिए) यदि आप ArrayList
उचित सिंक्रनाइज़ेशन के बिना पुनरावृति करते हैं , तो परिणाम एक दूषित सूची परिणाम हो सकता है। "तेज विफल" तंत्र संभवतः समवर्ती संशोधन का पता लगाएगा (हालांकि इसकी गारंटी नहीं है), लेकिन यह अंतर्निहित भ्रष्टाचार का पता नहीं लगाएगा। एक उदाहरण के रूप में, javadoc के लिए Vector.iterator()
यह कहते हैं:
"एक इट्रेटर के असफल-तेज़ व्यवहार की गारंटी नहीं दी जा सकती क्योंकि यह आम तौर पर बोल रहा है, असंबद्ध समवर्ती संशोधन की उपस्थिति में कोई कठिन गारंटी देना असंभव है। फेल-फास्ट पुनरावृत्तियों
ConcurrentModificationException
ने एक सर्वोत्तम प्रयास के आधार पर फेंक दिया। इसलिए, यह होगा। एक प्रोग्राम लिखने के लिए गलत है जो इसके सही होने के लिए इस अपवाद पर निर्भर करता है: बग का पता लगाने के लिए पुनरावृत्तियों के असफल-तेज़ व्यवहार का उपयोग किया जाना चाहिए। "
setArray
किसी भी संशोधन पर कॉल करने में सक्षम हैं ।
वे बल्कि असफल-तेज़ और कमजोर-संगत प्रकार हैं:
यदि संग्रह करते समय संग्रह के तरीकों (जोड़ / हटाएं) द्वारा संशोधित किया गया था, तो java.util
पैकेज थ्रो से IteratorsConcurrentModificationException
java.util.concurrent
पैकेज से Iterators आम तौर पर स्नैपशॉट पर पुनरावृति करते हैं और समवर्ती संशोधनों की अनुमति देते हैं, लेकिन पुनरावृत्ति के बाद संग्रह अपडेट को प्रतिबिंबित नहीं कर सकते हैं।
Iterator
या Enumeration
असफल-तेज या असफल-सुरक्षित के रूप में व्यवहार निर्दिष्ट। यह विशिष्ट कार्यान्वयन है (यानी विशिष्ट संग्रह iterator()
/ elements()
आदि तरीके जो इन वस्तुओं को वापस करते हैं) जो व्यवहार को निर्दिष्ट करते हैं। 2) विशिष्ट गणन कार्यान्वयन न तो तेजी से विफल होते हैं और न ही सुरक्षित होते हैं ।
एकमात्र अंतर विफल-सुरक्षित पुनरावृत्ति है कोई भी अपवाद नहीं फेंकता है, विफल-फास्ट Iterator के विपरीत।
यदि संग्रह संरचनात्मक रूप से संशोधित किया गया है, जबकि एक धागा इसके ऊपर पुनरावृत्त कर रहा है। ऐसा इसलिए है क्योंकि वे मूल संग्रह के बजाय संग्रह के क्लोन पर काम करते हैं और इसीलिए उन्हें असफल-सुरक्षित पुनरावृत्तिकर्ता कहा जाता है।
CopyOnWriteArrayList का Iterator असफल-सुरक्षित Iterator का एक उदाहरण है, जिसे ConcurrentHashMap keySet द्वारा लिखा गया itter भी विफल-सुरक्षित पुनरावृत्त है और कभी भी Java में ConcurrentModificationException नहीं फेंकता है।
यह परिदृश्य "समवर्ती प्रसंस्करण" के साथ संबंधित है, इसका मतलब है कि तब एक ही उपयोगकर्ता एक ही संसाधन का उपयोग कर रहा है। ऐसी स्थिति में, उपयोगकर्ता में से कोई भी उस संसाधन को संशोधित करने का प्रयास करता है, जो 'ConcurrentProcessingException' का कारण बनता है क्योंकि उस स्थिति में अन्य उपयोगकर्ता को अनुचित डेटा मिलता है। यह दोनों प्रकार इस तरह की स्थिति से संबंधित हैं।
सरल शब्द में,
विफल-उपवास:
सुरक्षा कम होना :