2010-05-21 9 views
17

यदि मैं एक तुलनात्मक का एक उदाहरण बना देता हूं, तो क्या संग्रह कोss.sort() का उपयोग करके संग्रह को सॉर्ट करने के लिए उस उदाहरण को एकाधिक थ्रेडों में उपयोग किया जा सकता है? या, क्या मुझे थ्रेड सुरक्षा सुनिश्चित करने के लिए Collections.sort() पर प्रत्येक कॉल के लिए तुलनाकर्ता का एक नया उदाहरण बनाने की आवश्यकता है?जावा में, संग्रहकर्ताओं() थ्रेड में सुरक्षित एक तुलनात्मक है?

उत्तर

18

यह पूरी तरह से निर्भर करता है कि आप Comparator को कैसे कार्यान्वित करते हैं। यदि, उदाहरण के लिए, इसमें इंस्टेंस वैरिएबल हैं जो तुलना किए गए हैं या जिनके सामग्रियों को तुलनात्मक रूप से बदल दिया गया है, यह थ्रेडसेफ नहीं होगा।

अधिकांश Comparator कार्यान्वयन ऐसी कोई चीज़ नहीं करते हैं, लेकिन एक परिदृश्य जो उचित रूप से हो सकता है, SimpleDateFormat का उपयोग करके स्ट्रिंग्स की तुलना करने के लिए दिनांकों का प्रतिनिधित्व करता है। दुर्भाग्यवश, SimpleDateFormat स्वयं धागा सुरक्षित नहीं है।

5

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

0

मुझे आश्चर्य हुआ कि अगर मुझे एक गैर थ्रेड सुरक्षित तुलनात्मक मिला, क्योंकि वे आमतौर पर (हमेशा?) पुनर्वित्तक होते हैं।

समेकन समस्या तब होगी जब संग्रह को सॉर्ट किया जा रहा था, जबकि सॉर्ट हुआ था।

+2

यह उचित है कि वह तुलनात्मक विधि के अंदर कुछ संसाधनों का उपयोग कर रहा हो जो थ्रेड सुरक्षित नहीं है। एक अनसंक्रनाइज़ संग्रह, कैलेंडर, इत्यादि संपादित करें: माइकल बी ने क्या कहा^ – Affe

+1

आप सही हैं, मैंने उन मामलों पर विचार नहीं किया था। – Artefacto

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