2009-01-17 1 views
12

में हैशटेबल, वेक्टर या हैश मैप या ऐरेलिस्ट का उपयोग करें जावा विकास के साथ तनावग्रस्त होने वाला एक ज्ञापन हमेशा वेक्टर पर ऐरेलिस्ट का उपयोग करता है। वेक्टर बहिष्कृत है। यह सच हो सकता है, लेकिन वेक्टर और हैशटेबल का लाभ है कि वे सिंक्रनाइज़ हैं।जावा

मैं एक भारी समवर्ती उन्मुख अनुप्रयोग के साथ काम कर रहा हूं, क्या वे वेक्टर की तरह सिंक्रनाइज़ किए गए ऑब्जेक्ट्स का उपयोग करने के लिए लाभ नहीं उठाएंगे? ऐसा लगता है कि उनके पास जगह है?

+0

वेक्टर अभी तक बहिष्कृत नहीं किया गया है। – Champ

+0

नेटबीन्स के साथ जावा 6 का नवीनतम संशोधन दावा करता है कि वेक्टर को बहिष्कृत किया गया है ... इसे थोड़ी देर पहले कहीं और घोषित किया जाना चाहिए था, क्योंकि मेरे पास इसके कुछ प्रतिस्थापन खोजने की आवश्यकता के बारे में कुछ महीनों बाद नोट्स और कुछ गैर- -प्रकाशित कक्षाओं को अभी भी इसकी आवश्यकता है। –

उत्तर

17

वेक्टर और हैशटेबल के साथ समस्या यह है कि वे केवल स्थानीय रूप से सिंक्रनाइज़ हैं। वे एक समवर्ती अनुप्रयोग में (भ्रष्ट डेटा के रूप में) नहीं तोड़ेंगे, हालांकि, स्थानीय सिंक्रनाइज़ेशन के कारण (जैसे मिलता है सिंक्रनाइज़ किया जाता है, लेकिन केवल रिटर्न मिलने तक), आप वैसे भी ऐसी परिस्थितियों के लिए अपना स्वयं का सिंक्रनाइज़ेशन करना चाहेंगे सामग्री पर पुनरावृत्ति के रूप में। अब, यहां तक ​​कि आपके पुट-विधि को पुनरावृत्ति सिंक्रनाइज़ेशन के साथ सहयोग करने के लिए कुछ अतिरिक्त सिंक्रनाइज़ेशन की आवश्यकता होती है और आप ऐसी स्थिति के साथ समाप्त होते हैं जहां आपका हैशटेबल/वेक्टर दोगुना सिंक्रनाइज़ होता है।

+0

बिल्कुल गलत क्या है? – falstro

+0

गलती से मेरी टिप्पणी हटा दी। आप गलत हैं कि() को सिंक्रनाइज़ेशन जोड़ने की आवश्यकता है; इटरेटर() केवल वेक्टर पर सिंक होगा, जो वेक्टर के भीतर सभी सिंक्रनाइज़ेशन के साथ म्यूटेक्स करता है। इसमें वे एक संग्रह के समान हैं। सिंक्रनाइज़लिस्ट()। –

+0

यदि आप अपने इटरेटर को फॉर-लूप में उपयोग करते हैं, तो फॉर-लूप सामग्री सिंक्रनाइज़ नहीं की जाएगी और यदि आपका कोई 'अगली' के बीच उपयोग करता है तो आपका इटेटरेटर एक समवर्ती संशोधन अपवाद फेंक देगा। इसलिए, आपको अतिरिक्त सिंक्रनाइज़ेशन की आवश्यकता है (निश्चित रूप से अन्य विकल्प भी हैं)। – falstro

13

यदि आपको सिंक्रनाइज़ किए गए ऐरेलिस्ट या हैश मैप की आवश्यकता है, तो आप उन्हें लपेट सकते हैं।

List list = Collections.synchronizedList(new ArrayList(...)); 
Map m = Collections.synchronizedMap(new HashMap(...)); 

व्यक्तिगत तौर पर मैं इन संग्रहों भारी थ्रेडेड कोड में बहुत उपयोगी नहीं में "सिंक्रनाइज़" तरीकों को खोजने। कुछ नए संग्रह हैं जो बहुत अधिक मदद करते हैं, लेकिन अधिकतर मुझे लगता है कि मैं स्वयं को सिंक्रनाइज़ ऑब्जेक्ट्स बना रहा हूं और उनके चारों ओर सिंक्रनाइज़ कर रहा हूं, या java.util.concurrent

8

सिंक्रनाइज़ेशन की जगह है, लेकिन यह नहीं है Vector और ArrayList के बीच केवल अंतर। Vector अपनी आंतरिक स्टोरेज सरणी को इसकी क्षमता से अधिक होने पर एक निश्चित राशि से बढ़ता है, जबकि ArrayList इसे एक निश्चित कारक द्वारा बढ़ाता है, जो आम तौर पर एक बेहतर तरीका है (क्योंकि यह किसी आइटम को जोड़ने के लिए ओ (1) के amortized cost देता है)।

भी ध्यान रखें कि किसी भी Collections.synchronizedList()List कार्यान्वयन पर एक तुल्यकालन दृश्य बनाने के लिए इस्तेमाल किया जा सकता है, तो आप Vector की विशेषताओं के लिए बाध्य होने के लिए नहीं है (उदाहरण के लिए एक तुल्यकालन LinkedList चाहते हो सकता है)।

+2

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

+0

ऐसा लगता है कि मुझे यह याद रखना होगा! –

3

आप एक सूची रूपांतरित करने या सिंक्रनाइज़ संस्करण में नक्शे पर स्थिर संग्रह तरीकों का उपयोग कर सकते हैं: सामान्य में http://java.sun.com/j2se/1.4.2/docs/api/java/util/Collections.html#synchronizedList(java.util.List)

आप सामान्य रूप से अधिक के लिए लॉक करने की आवश्यकता है कि सूची या नक्शे के लिए एक व्यक्ति कॉल।

0

मुझे ऐसा लगता है कि केवल बार आप संग्रह ही आवश्यकता होगी धागा सुरक्षित रहने के लिए कर रहे हैं:

  • तो संग्रह (सार्वजनिक या डिफ़ॉल्ट गुंजाइश)
  • तो कक्षा के बाहर से दिखाई दे रहा है यदि आप एक विधि
  • से संग्रह करने के लिए एक संभाल के लिए लौट रहे संग्रह अपनी कक्षा

की एक स्थिर सदस्य उन सब के सब शायद रहे हैं एक बुरा विचारों डिजाइन के लिहाज से है।

संग्रह बेहतर बनाने या सिंक्रनाइज़ किए गए तरीकों के माध्यम से इसे बेहतर बनाने के लिए एक बेहतर तरीका होगा। स्थिर सदस्य के मामले में, यदि आपको ऐसा करने की आवश्यकता है, तो सिंगलटन जाने का एक बेहतर तरीका होगा।

17

ConcurrentHashMap हैशटेबल से way faster है।यह समवर्ती है, सिंक्रनाइज़ नहीं है। यह एक साथ कई पाठकों/लेखकों को स्वीकार करता है।

हालांकि ऐसी कोई 'समवर्ती' सरणी सूची नहीं है। आपकी जरूरतों के आधार पर, CopyOnWriteArrayList आपको जो चाहिए वह हो सकता है या नहीं भी हो सकता है।