2013-02-05 16 views
5

मेरे पास स्ट्रिंग (टैगलिस्ट) की एक सूची है जिसे पढ़ने के लिए कई धागे के बीच साझा करने की आवश्यकता है, इसलिए मैं इसका एक अपरिवर्तनीय संस्करण बनाता हूं और इसे थ्रेड में पास करता हूं, मुझे यकीन नहीं है कि यह थ्रेड सुरक्षित है, क्योंकि धागे केवल उस सूची को पढ़ते हैं मुझे लगता है कि यह ठीक होना चाहिए?unmodifiableList धागा सुरक्षित है?

भी जब मैं धागे को उस अनमोडिफिबल सूची को पास करता हूं, तो क्या यह एक प्रतिलिपि पास करता है और थ्रेड्स द्वारा साझा किया जाता है या क्या यह एकाधिक प्रतिलिपि बनाता है और प्रत्येक प्रति को एक प्रति पास करता है?

final List<String> tList = Collections.unmodifiableList(tagList); 
List<Future<Void>> calls = new ArrayList<Future<Void>>(); 

FileStatus[] fsta = _fileSystem.listStatus(p);  
for (FileStatus sta : fsta) { 
    final Path path = new Path(sta.getPath(), "data.txt"); 
    if (!_fileSystem.exists(path)) {   
     continue; 
    } 
    else { 
     calls.add(_exec.submit(new Callable<Void>() { 
      @Override 
      public Void call() throws Exception { 
       filterData(path, tList); 
       return null; 
      } 
     })); 
    } 
} 
+1

यह धागा सुरक्षित है। – jdb

उत्तर

6

यह पूरी तरह से इस बात पर निर्भर करता है कि अंतर्निहित सूची पढ़ने के संचालन पर थ्रेड सुरक्षित है या नहीं। अनमोडिफाइड सूची केवल अतिरिक्त सिंक्रनाइज़ेशन के बिना अंतर्निहित सूची में size(), get (int) आदि जैसी सभी पढ़ी गई कॉल पास करती है।

कल्पना करें, उदाहरण के लिए, सूची का कार्यान्वयन, प्रत्येक बार इसकी आवश्यकता होने पर इसकी गणना करने के बजाय कैश हैश कोड। इस तरह के कार्यान्वयन के लिए, hashCode() विधि वास्तव में केवल पढ़ने के लिए नहीं है, क्योंकि यह आंतरिक रूप से कैश हैश कोड मान को संशोधित कर सकती है।

एक और उदाहरण लिंक्डलिस्ट का एक स्वाद है जो इसके सूचकांक के साथ अंतिम पहुंच प्रविष्टि के संदर्भ में कैश करता है, इसलिए पास के तत्वों तक पहुंचने के लिए और अधिक प्रयास किए जाएंगे। इस तरह के कार्यान्वयन के लिए, विधि get (int) केवल पढ़ने के लिए नहीं होगी क्योंकि यह कैश्ड संदर्भ और अनुक्रमणिका अद्यतन करता है, और इस प्रकार संभवतः थ्रेड सुरक्षित नहीं होगा।

+1

और अंतर्निहित 'सूची' संशोधित हो सकती है। असुरक्षित रूप से प्रकाशित होने पर भी संभवतः असुरक्षित। –

+0

तथ्य यह है कि अंतर्निहित सूची में संशोधन हो सकता है, थ्रेड सुरक्षा से कोई लेना देना नहीं है। –

+3

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

2

यह धागा सुरक्षित है (क्योंकि यह बदला नहीं जा सकता):

यहाँ मेरी कोड है। यह एक ही प्रतिलिपि पास करता है।

हालांकि, लिपटे सूची (tagList) अभी भी थ्रेड सुरक्षित नहीं है। साझा किए जाने पर आपको लिपटे सूची को संशोधित नहीं करना चाहिए। unmodifiableList() द्वारा लौटाई गई सूची का एकमात्र कारण सुरक्षित है क्योंकि लिपटे सूची में संशोधनों की अनुमति नहीं है।

0

जैसा कि आप कहते हैं कि सूची unmodifialble है; इसलिए यह धागा सुरक्षित होगा।

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

बस एक सावधानी; कभी भी टैगलिस्ट तक पहुंचें। इसे tList नामक लपेटा हुआ अपरिवर्तनीय संग्रह के माध्यम से हमेशा एक्सेस करें। यह हासिल किया जा सकता है यदि आप इसे ठीक से encapsulate।

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