2011-05-24 12 views
7

मेरे पास सिंक्रनाइज़ सूची के संबंध में एक सामान्य प्रश्न है।
का कहना है कि निर्माता में मैं एक सूचीजावा - सामान्य सिंक्रनाइज़लिस्ट प्रश्न

List synchronizedList = Collections.synchronizedList(list); 

createing रहा हूँ और मैं एक विधि सूची में एक वस्तु कहते है की सुविधा देता है।

public void add(String s){ 
    synchronizedList.add(s) 
} 

एक और धागा है कि हर कुछ सेकंड की जाँच करता है अगर वहाँ कुछ ऐसी पंक्तियां हैं, एक फ़ाइल में डंप और उन सब को हटा देता है।

अब कहें कि मैं प्रत्येक पंक्ति को दोहराता हूं और इसे डीबी में सहेजता हूं। सभी पुनरावृत्ति के बाद मैं सूची साफ़ करता हूं।

मल्टीथ्रेड समर्थन मेरी मदद कैसे करता है?
अन्य धागे में स्पष्ट() से पहले मैं सूची में एक तत्व जोड़ सकता हूं।
जब तक कि मैं खुद को लॉक प्रबंधित नहीं करता (जिसे मैं वास्तव में इसके लिए एक सिंक की गई सूची की आवश्यकता नहीं है) यह स्वयं।

+0

सभी तीन उत्तरों के राज्य के रूप में, सिंक्रनाइज़ सूची का अर्थ है कि उस सूची के सभी संचालन परमाणु होने की गारंटी है या अलग-अलग विधि कॉलों तक सीरियल पहुंच की गारंटी है। मुझे अपने सहयोगी से यह पूछना पड़ा कि इसका क्या मतलब है। तो इसका मतलब है कि सूची पर ऑपरेशन (उपरोक्त कोड स्निपेट से) 'सिंक्रनाइज़ लिस्ट.size() 'और' सिंक्रनाइज़लिस्ट लिस्ट.एड '' समानांतर में नहीं हो सकता है। यह कुछ लोगों के लिए स्पष्ट नहीं है जो इस धागे को पढ़ रहे हैं। तो दूसरों को समझने में मदद करने के लिए जो समझ में नहीं आता है। धन्यवाद @ व्हाइटफैंग 34, @ जेबी-निजेट और @khachik नीचे स्पष्टीकरण के लिए। –

उत्तर

13

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

यह आवश्यक है कि उपयोगकर्ता मैन्युअल रूप से जब यह खत्म हो पुनरावृत्ति लौटे सूची पर सिंक्रनाइज़ करें।

यदि आपकी सूची कहीं और उपयोग की जाती है तो आप कम से कम व्यक्तिगत विधि कॉल से इसकी रक्षा कर सकते हैं जो अन्यथा थ्रेड-सुरक्षित नहीं होगा। यदि आप पूरी तरह से सूची का प्रबंधन कर रहे हैं, तो आप अपने add विधि में synchronized ब्लॉक जोड़ सकते हैं और उसी लॉक का उपयोग कर सकते हैं जिसका उपयोग आप इसे करते समय करेंगे।

13

synchronizedList वास्तव में केवल गारंटी देता है कि सूची में प्रत्येक विधि कॉल सिंक्रनाइज़ किया गया है। यदि आपको सिंक्रनाइज़ तरीके से किए जाने वाले कई संचालन की आवश्यकता है, तो आपको सिंक्रनाइज़ेशन स्वयं को संभालना होगा।

BTW, यह स्पष्ट रूप javadoc for Collections.synchronizedList में कहा गया है:

यह आवश्यक है कि उपयोगकर्ता मैन्युअल जब यह खत्म हो पुनरावृत्ति लौटे सूची पर सिंक्रनाइज़:

List list = Collections.synchronizedList(new ArrayList()); 
     ... 
    synchronized(list) { 
     Iterator i = list.iterator(); // Must be in synchronized block 
     while (i.hasNext()) 
      foo(i.next()); 
    } 
4

सिंक्रनाइज़ सूची इसका मतलब है कि उस सूची के सभी संचालन परमाणु होने की गारंटी है। आपके द्वारा वर्णित परिदृश्य में सूची के बाहर कुछ लॉकिंग होना आवश्यक है। मॉनिटर्स को लागू करने के लिए सेमफोरों पर विचार करें या synchronized ब्लॉक बनाएं। java.util.concurrent पर एक नज़र डालें।