2011-12-05 5 views
11

मैं दस्तावेज ढूंढने की कोशिश कर रहा हूं जो java.util.concurrent.Future है/थ्रेडसेफ नहीं है। जैसे मैं सुरक्षित रूप से भविष्य के एक ही उदाहरण को कई धागे में दे सकता हूं, जो सभी Future.get (...) को कॉल करेंगे?java.util.concurrent.Future threadsafe है?

मैंने भविष्य में भविष्य का उपयोग करके कोड का परीक्षण किया है और ऐसा लगता है कि अगर मैं दस्तावेज की उम्मीद कर सकता हूं कि भविष्य में समवर्ती पहुंच के लिए भविष्य सुरक्षित है तो मैं बहुत खुश हूं।

धन्यवाद।

+2

अनिवार्य रूप से, यह टिप्पणी निजेट के उत्तर के समान ही है: आप जेडीके जावाडोक में स्मृति स्थिरता गारंटी देख सकते हैं: http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/package- सारांश.html # पैकेज_डिस्क्रिप्शन –

+0

क्या यह पढ़ने के लिए सुरक्षित है "भविष्य में होने वाले एसिंक्रोनस गणना द्वारा किए गए कार्यों को भविष्य में होने वाले कार्यों से पहले की भविष्यवाणियों को Future.get() के माध्यम से किसी अन्य धागे में पुनर्प्राप्त करने के बाद।" _many_ अन्य धागे के साथ-साथ एक अन्य धागे के लिए भी सच है? - "एक और धागा" पढ़ा सचमुच एक ** एकल ** अन्य धागे को कई के विपरीत इंगित करता है। अगर ऐसा लगता है कि भविष्य के कार्यान्वयनकर्ता को कई लोगों के लिए तोड़ने और एक के लिए काम करने के लिए अपने रास्ते से बाहर जाना होगा, इसलिए मुझे दृढ़ता से संदेह है कि यह वास्तविकता में सुरक्षित है। – S42

+1

हां, क्योंकि प्रत्येक कॉल 'Future.get()' की गारंटी "पहले से पहले" गारंटी के तहत होगी। ऐसा इसलिए है क्योंकि एक ही असेंबली में संकलित प्रत्येक कॉल http://en.wikipedia.org/wiki/Memory_barrier –

उत्तर

9

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

+1

मैं दृढ़ता से सहमत हूं कि यह वास्तविकता में लगभग निश्चित रूप से सुरक्षित है, क्योंकि थ्रेड-सुरक्षा होने के लिए-पहले 2 धागे के बीच काम करने से पहले एन थ्रेड के लिए भी ठीक होगा, हालांकि मैं समझ नहीं सकता कि अगर मैं व्याख्या कर सकता हूं तो मैं 100% स्पष्ट नहीं हूं गारंटी के शब्द एक दूसरे धागे का सुझाव देते समय कई धागे के लिए गारंटी के रूप में पहले होता है। उस मामूली आरक्षण के बावजूद मैं आपकी टिप्पणी को वोट दे रहा हूं क्योंकि ऐसा लगता है कि यह सबसे अच्छा जवाब उपलब्ध है। – S42

+1

@ एस 42 आप शब्द भी सचमुच पढ़ रहे हैं। जावा में, धागे की एक जोड़ी के बीच बिल्कुल कोई विशेष संचार नहीं है; सभी धागे स्मृति को सिंक्रनाइज़ करके संवाद करते हैं, और यह सभी धागे के लिए समान रूप से उपलब्ध है। – toto2

4

यदि आप Future का उपयोग कर रहे हैं ExecutorService से लौटाए गए हैं, तो हाँ उन्हें थ्रेड-सुरक्षित होने की गारंटी है। चूंकि भविष्य एक इंटरफ़ेस है, इसलिए इंटरफ़ेस का निर्माता यह गारंटी नहीं दे सकता कि सभी कार्यान्वयन हालांकि थ्रेड-सुरक्षित होंगे।

निजेट हालांकि एक अच्छा मुद्दा लाता है। डॉक्टर का कहना है कि भविष्य इंटरफ़ेस के कार्यान्वयन को थ्रेड सुरक्षित होना चाहिए, कार्यान्वयन थ्रेड-सुरक्षित को भविष्य में अनुबंध का उल्लंघन नहीं करेगा

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