2012-03-08 18 views
8

मैं हाल ही में जावा में एक समवर्ती कार्यक्रम लिख रहा था और खोखले दुविधा में आया था: मान लीजिए कि आपके पास वैश्विक डेटा संरचना है, जो नियमित गैर-सिंक्रनाइज़, गैर-समवर्ती lib जैसे हैश मैप का हिस्सा है। क्या यह अलग-अलग धागे को संग्रह के माध्यम से पुन: स्थापित करने के लिए ठीक है (बस पढ़ना, कोई संशोधन नहीं) शायद अलग-अलग, अंतःस्थापित अवधि यानी थ्रेड 1 आधा रास्ता थ्रूफू हो सकता है जब थ्रेड 2 उसी मानचित्र पर अपना इटरेटर प्राप्त करता है?एक ही मानचित्र पर पुनरावृत्त एकाधिक धागे

+0

जैसा कि आप कहते हैं, धागे के अलग-अलग इटरेटर हैं। चूंकि वे साझा नहीं किए जाते हैं, इसलिए कोई समस्या नहीं है। –

+0

धन्यवाद दोस्तों, महान जवाब! – Bober02

उत्तर

12

यह ठीक है। ऐसा करने की क्षमता इटरेटर के रूप में इस तरह के इंटरफेस बनाने का कारण है। संग्रह पर पुनरावृत्त होने वाले प्रत्येक थ्रेड में इटेटरेटर का अपना उदाहरण होता है जिसमें इसकी स्थिति होती है (उदा। जहां आप अपनी पुनरावृत्ति प्रक्रिया में हैं)।

यह कई धागे एक ही संग्रह पर एक साथ फिर से शुरू करने की अनुमति देता है।

4

समस्याएं तब उत्पन्न होती हैं जब आप डेटा संरचना पर समवर्ती संशोधन का प्रयास करते हैं।

उदाहरण के लिए, यदि एक धागा मानचित्र की सामग्री पर पुनरावृत्ति कर रहा है, और दूसरा धागा उस संग्रह से तत्वों को हटा देता है, तो आप गंभीर परेशानी के लिए आगे बढ़ेंगे।

यदि आपको सुरक्षित रूप से उस संग्रह को संशोधित करने के लिए कुछ धागे की आवश्यकता है, तो जावा ऐसा करने के लिए तंत्र प्रदान करता है, अर्थात्, ConcurrentHashMap।

ConcurrentHashMap in Java?

वहाँ भी Hashtable, जो HashMap रूप में एक ही इंटरफ़ेस है, लेकिन सिंक्रनाइज़ है, हालांकि यह, उपयोग वर्तमान में सलाह नहीं दी जाती (बहिष्कृत) है, क्योंकि यह प्रदर्शन ग्रस्त है जब तत्वों की संख्या में लंबा होता जाता है (तुलना की जाती है ConcurrentHashMap को जो पूरे संग्रह को लॉक करने की आवश्यकता नहीं है)।

यदि आपके पास ऐसा संग्रह होता है जो सिंक्रनाइज़ नहीं होता है और आपको इसके ऊपर पढ़ने और लिखने के कई धागे होने की आवश्यकता होती है, तो आप इसका सिंक्रनाइज़ संस्करण प्राप्त करने के लिए Collections.synchronizedMap (मानचित्र) का उपयोग कर सकते हैं।

7

यह ठीक होना चाहिए, जब तक कि कोई लेखक न हो।

यह समस्या readers-writer lock के समान है, जहां एकाधिक पाठकों को डेटा से पढ़ने की अनुमति है, लेकिन उस समय के दौरान जब लेखक के पास "लॉक" होता है। एक ही समय में पढ़ने वाले गुणकों के लिए कोई सहमति नहीं है। [data race केवल तभी हो सकता है जब आपके पास कम से कम एक लिखें]।

2

उपर्युक्त उत्तर निश्चित रूप से अच्छी सलाह हैं। आम तौर पर, जब आप डेटा संरचना को संशोधित नहीं करते हैं, तब तक जावा को समवर्ती धागे के साथ लिखते समय, आपको उस संरचना को पढ़ने के साथ-साथ कई धागे के बारे में चिंता करने की आवश्यकता नहीं होती है।

क्या आपको भविष्य में एक ही समस्या होनी चाहिए, सिवाय इसके कि वैश्विक डेटा संरचना को समवर्ती रूप से संशोधित किया जा सकता है, मैं जावा क्लास लिखने का सुझाव दूंगा कि सभी धागे संरचना को एक्सेस और संशोधित करने के लिए उपयोग करते हैं। यह वर्ग सिंक्रनाइज़ किए गए तरीकों या ताले का उपयोग करके अपनी स्वयं की समवर्ती पद्धति को लागू कर सकता है। जावा ट्यूटोरियल में जावा की समवर्ती तंत्र का बहुत अच्छा स्पष्टीकरण है। मैंने व्यक्तिगत रूप से यह किया है और यह काफी सीधे है।

संबंधित मुद्दे