2010-02-05 12 views
6

मेरे कार्यक्रम में 100 धागे हैं।जावा कंसुरेंसी: लॉक क्षमता

1) यदि ArrayList खाली है, यह

2) यदि ArrayList खाली नहीं है,, ArrayList में पाया तत्वों के माध्यम से पुनरावृति करने के लिए कुछ गुणों के साथ तत्व जोड़ यदि उपयुक्त पाया:

हर एक धागा करता है तत्व (कुछ गुणों से मेल खाते हुए), इसे प्राप्त करें और सरणी हटाएं

समस्या यह है कि एक थ्रेड सरणी के माध्यम से पुनरावृत्ति कर रहा है, जबकि अन्य 99 धागे सरणी पर लॉक की प्रतीक्षा कर रहे हैं।

यदि आप सभी 100 थ्रेड लॉक-कम स्थिति में काम करना चाहते हैं तो आप मुझे क्या सुझाव देंगे? तो वे सब करने के लिए काम है?

धन्यवाद

+1

ओवरकिल की तरह लगता है। आप तेजी से क्या करने की कोशिश कर रहे हैं? यह ठीक ग्रॅन्युलरिटी पर कुख्यात रूप से कठिन है जिसका आप वर्णन कर रहे हैं। –

+0

मैं यहां थ्रेड परफॉर्मेंस को बेहतर बनाना चाहता हूं, क्योंकि तथ्य यह है कि अन्य 99 धागे सरणी पर लॉक के लिए इंतजार कर रहे हैं। मेरी जावा एप्लिकेशन – Andrey

+0

पवित्र बकवास 100 धागे जो बहुत अधिक है, पर निर्भर करता है, क्या आपके पास 100 कोर हैं? लॉल ओह और वे लॉक कम हालत में काम कर सकते हैं लेकिन वे अभी भी आपको संदर्भित कर रहे हैं (जब तक आपके पास 100 कोर लुल्ज़ नहीं है) – lemon

उत्तर

2

आप shared vs exclusive लॉकिंग को देखा है? आप सूची में साझा लॉक का उपयोग कर सकते हैं, और फिर सूची तत्वों पर 'हटाई गई' संपत्ति हो सकती है। सूची तत्वों की जांच करने के लिए आप जिस भविष्यवाणी का उपयोग करते हैं, उसे यह सुनिश्चित करने की आवश्यकता होगी कि आपके पास जो भी अन्य प्रश्न हैं, उसके अलावा तत्व को 'हटाया गया' चिह्नित नहीं किया गया है - संभावित पढ़ने-लिखने के संघर्षों के कारण, आपको प्रत्येक तत्व को लॉक करना होगा बढ़ावा देते हैं। फिर वास्तविक रूप से वास्तविक के लिए हटाए जाने के लिए सूची में एक विशेष लॉक प्राप्त करें।

रीड लॉक सूची में बहुत अधिक सहमति के लिए अनुमति देता है। सूची के प्रत्येक तत्व पर अनन्य ताले उतने अच्छे नहीं हैं, लेकिन आपको प्रत्येक थ्रेड पर 'हटाए गए' ध्वज को अपडेट करने के लिए मेमोरी मॉडल को मजबूर करने की आवश्यकता है, इसलिए इसके आसपास कोई रास्ता नहीं है।

+0

यह अच्छा लगता है। मैं अनन्य लॉकिंग का प्रयास करूंगा। धन्यवाद। – Andrey

+0

'साझा' हिस्सा क्या अधिक दिलचस्प है। – TheDon

2

सबसे पहले यदि आप उस मशीन पर नहीं चल रहे हैं जिसमें 64 कोर या अधिक हैं तो आपके 100 थ्रेड शायद स्वयं में एक प्रदर्शन हॉग हैं।

तो फिर तुम क्या वर्णन कर रहे हैं के लिए एक ArrayList निश्चित रूप से नहीं एक अच्छा विकल्प है क्योंकि एक तत्व को हटाने से amortized निरंतर समय में नहीं रन करता है लेकिन रैखिक समय हे (एन) में है। तो यह एक दूसरा प्रदर्शन हॉग है। आप शायद अपने ऐरेलिस्ट के बजाय एक लिंक्डलिस्ट का उपयोग करना चाहते हैं (यदि आप किसी सूची का उपयोग करने पर जोर देते हैं)।

अब मुझे बहुत संदेह है कि आपको प्रत्येक तत्व को खोजने के लिए हर बार अपनी पूरी सूची में पुन: प्रयास करने की आवश्यकता है: क्या कोई अन्य डेटा संरचना अधिक उचित नहीं होगी? हो सकता है कि आपके द्वारा अपनी सूची में डाले गए तत्वों में "समानता" जैसी अवधारणा है और इसलिए ओ (1) लुकअप समय के साथ एक मानचित्र का उपयोग किया जा सकता है?

यह सिर्फ शुरुआत के लिए है: जैसा कि मैंने आपको दिखाया है, आपके द्वारा वर्णित कम से कम दो गंभीर प्रदर्शन समस्याएं हैं .... यदि आपको और सहायता चाहिए तो शायद आपको अपने प्रश्न को स्पष्ट करना चाहिए।

+0

यह काफी संभव है कि ओ (1) डेटास्ट्रक्चर का ओवरहेड छोटे सरणी के लिए रैखिक खोज समय से अधिक हो। एंड्री का कहना है कि सरणी की अपेक्षित लंबाई 1-10 तत्व है। वास्तव में – TheDon

+0

। मैं अपने प्रोग्राम को HashMap का उपयोग करने के लिए फिर से लिखूंगा – Andrey

1

यदि Comparator का उपयोग करके "उपयुक्त तत्व (कुछ गुणों से मिलान करना" को एन्कोड किया जा सकता है तो PriorityBlockingQueue प्रत्येक धागे को कतार को मतदान करने की अनुमति देगा, सूची को खोजने या नए तत्व को ग्रहण किए बिना अगला तत्व लेना होगा अगर कतार खाली है।

परिशिष्ट: Thilo एक आवश्यक बिंदु उठाएं: जैसे ही आपका दृष्टिकोण विकसित होता है, आप अनुभव कर सकते हैं कि कितने धागे इष्टतम हैं।

+0

मैं इसे देख लूंगा। धन्यवाद। – Andrey

+0

मुझे लगता है कि प्रत्येक धागे का एक अलग मानदंड होता है। अन्यथा इन सभी धागे को कम समझ में आता है। – Thilo

0

कुंजी वास्तव में केवल जब आपको आवश्यकता हो तो सरणी सूची पर ऑब्जेक्ट लॉक का उपयोग करना है।

एक अच्छा विचार सरणी को उपclass करना होगा और एकल पढ़ने + लिखने + प्रक्रियाओं को सिंक्रो प्रदान करना होगा।

यह लॉकिंग के साथ बढ़िया ग्रैन्युलरिटी सुनिश्चित करेगा जबकि सरणी सूची के अर्थशास्त्र की रक्षा करते समय थ्रेड को सरणी सूची के माध्यम से चलाने की इजाजत दी जाएगी।

0

एक एकल धागा सरणी का मालिक है और इसे जोड़ने के लिए जिम्मेदार होना और काम करने के लिए इसे फिर से भरना। एक बार काम की इकाई मिल जाने के बाद, काम को ब्लॉकिंगक्यूयू पर रखें। कतार से काम को हटाने के लिए अपने सभी कार्यकर्ता धागे का उपयोग करें() का उपयोग करें।

यह सरणी के माध्यम से प्रति गुजरने के लिए कई इकाइयों की खोज की अनुमति देता है और उन्हें प्रतीक्षा कार्यकर्ता धागे को काफी कुशलतापूर्वक सौंप दिया जा सकता है।

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