2015-09-29 6 views
6

गैर-समवर्ती डेटा संरचना स्रोतों की धाराओं का उपयोग करने के लिए गैर हस्तक्षेप की आवश्यकता का मतलब है कि हम निष्पादन के दौरान डेटा संरचना के तत्व की स्थिति को नहीं बदल सकते हैं एक स्ट्रीम पाइपलाइन (इसके अतिरिक्त हम स्रोत डेटा संरचना को भी बदल नहीं सकते हैं)? (प्रश्न 1)जावा 8 धाराओं में गैर हस्तक्षेप सटीक अर्थ

अनुभाग के बारे में non-interference में, धारा पैकेज विवरण में, अपने ने कहा: "सबसे डेटा स्रोतों के लिए, हस्तक्षेप को रोकने सुनिश्चित करना है कि डेटा स्रोत के निष्पादन के दौरान सभी पर संशोधित नहीं है इसका मतलब है स्ट्रीम पाइपलाइन। "

इस मार्ग में तत्वों की स्थिति को संशोधित करने का उल्लेख नहीं है?

उदाहरण के लिए, "आकार" मानना ​​गैर थ्रेड-सुरक्षित संग्रह (जैसे ArrayList) है, क्या नीचे दिए गए कोड में हस्तक्षेप माना जाता है? (कम से कम कहने के लिए) (प्रश्न 2)

shapes.stream() 
     .filter(s -> s.getColor() == BLUE) 
     .forEach(s -> s.setColor(RED)); 

यह उदाहरण एक reliable source से लिया जाता है, तो यह सही होना चाहिए। लेकिन अगर मैंने stream() को parallelStream() पर बदल दिया है, तो क्या यह अभी भी सुरक्षित और सही होगा? (प्रश्न 3)

दूसरी तरफ, नाफ्टलिन मॉरीस द्वारा "मास्टरिंग लैम्बडास", एक और विश्वसनीय स्रोत, यह स्पष्ट करता है कि पाइपलाइन ऑपरेशन द्वारा तत्वों के राज्य (मूल्य) को वास्तव में हस्तक्षेप करना बदलता है। गैर-हस्तक्षेप के बारे में अनुभाग से (3.2.3):

"लेकिन धाराओं के नियम धारा स्रोतों के किसी भी संशोधन को रोकते हैं, उदाहरण के लिए, तत्व के मूल्य को बदलना- किसी भी थ्रेड द्वारा, न केवल पाइपलाइन संचालन । "

यदि पुस्तक में जो कहा गया है वह सही है, तो इसका मतलब यह है कि हम तत्वों की स्थिति को संशोधित करने के लिए स्ट्रीम एपीआई का उपयोग नहीं कर सकते हैं (forEach का उपयोग करके), और इसे नियमित इटरेटर (या प्रत्येक के लिए, या Iterable.forEach)? (प्रश्न 4)

उत्तर

6

"दुष्प्रभाव वाले कार्यों" नामक कार्यों की एक बड़ी श्रेणी है। JavaDoc कथन सही और पूर्ण है: यहां हस्तक्षेप का अर्थ है उत्परिवर्तनीय स्रोत को संशोधित करना। एक और मामला राज्यव्यापी अभिव्यक्ति है: अभिव्यक्ति जो आवेदन स्थिति पर निर्भर करती है या इस राज्य को बदलती है। आप ओरेकल साइट पर Parallelism ट्यूटोरियल पढ़ सकते हैं।

सामान्य रूप से आप स्ट्रीम तत्वों को स्वयं संशोधित कर सकते हैं और इसे "हस्तक्षेप" के रूप में नहीं कहा जाना चाहिए। सावधान रहें, भले ही आपके पास एक ही म्यूटेबल ऑब्जेक्ट स्ट्रीम स्रोत द्वारा कई बार उत्पादित किया गया हो (उदाहरण के लिए, Collections.nCopies(10, new MyMutableObject()).parallelStream() का उपयोग करना। हालांकि यह सुनिश्चित किया जाता है कि एक ही स्ट्रीम तत्व को कई धागे द्वारा संसाधित नहीं किया जाता है, यदि आपकी स्ट्रीम दो बार समान तत्व उत्पन्न करती है, तो आप जब यह forEach में संशोधित करने, उदाहरण के लिए निश्चित रूप से एक रेस स्थिति है।

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

तो वापस अपने प्रश्नों के:

प्रश्न 1: जब तक आप दोहरा वस्तुओं है कोई यह कोई हस्तक्षेप है: नहीं हम तत्व राज्य को बदल सकते हैं, और यह हस्तक्षेप नहीं कहा है (हालांकि कहा जाता statefullness)

प्रश्न 2 प्रश्न 3 अपनी स्ट्रीम स्रोत में)

: आप सुरक्षित रूप से parallelStream() वहाँ

प्रश्न 4 का उपयोग कर सकते हैं: नहीं, तुम इस मामले में धारा एपीआई का उपयोग कर सकते हैं।

+1

दूसरे शब्दों में, "हस्तक्षेप" उच्च स्तर पर रहता है। एक धारा तत्व को संशोधित करने में एक क्रिया हस्तक्षेप कर सकती है, जब यह समान तत्व को एक साथ संशोधित कर रही है, लेकिन यह तब नहीं होती जब यह अलग-अलग वस्तुओं को संशोधित कर रही हो। इसी तरह, एक 'ऐरेलिस्ट' अपने आप में धागा सुरक्षित नहीं है, एक समवर्ती परिदृश्य में 'ऐरेलिस्ट का सही ढंग से उपयोग की संभावना को रोकता नहीं है। यह सब कुछ है, * कैसे * इसका उपयोग किया जाता है ... – Holger

+0

आपके स्पष्ट और विस्तृत उत्तर के लिए धन्यवाद टैगिर। संग्रह में संशोधित तत्वों को बनाए रखना आम कार्य है, और इटरेटर का उपयोग करके किए गए संग्रहों पर कई संचालन - तत्वों को बदलने की जरूरत है, इसलिए यह वास्तव में मुझे परेशान करता है। यदि हम सुरक्षित रूप से ऐसा नहीं कर पा रहे थे (कम से कम समांतर धाराओं के मामले में) तो यह धाराओं को बहुत कम उपयोगी बना देता। – Shay

+0

टैगिर, ध्यान दें कि राज्यव्यापी लैम्ब्डा को स्ट्रीम पैकेज में परिभाषित किया गया है (और आपके द्वारा उल्लिखित लिंक में) "जिसका परिणाम किसी भी राज्य पर निर्भर करता है जो स्ट्रीम पाइपलाइन के निष्पादन के दौरान बदल सकता है"। – Shay

1

डेटा संरचना में संग्रहीत किसी ऑब्जेक्ट की स्थिति को संशोधित करना डेटा संरचना के तत्व को पुन: असाइन करने से अलग है।

जब दूसरा लिखता है कि "तत्व के मूल्य को बदलना" संभवतः उनका मतलब है कि मौजूदा List की अनुक्रमणिका में कोई नई वस्तु असाइन करना है।

अपने link से:

यह lambdas तरीकों स्ट्रीम करने के लिए पारित कर दिया किसी भी दुष्प्रभाव से बचने के लिए सबसे अच्छा है। जबकि कुछ साइड इफेक्ट्स, जैसे कि डिबगिंग स्टेटमेंट्स जो डिबगिंग स्टेटमेंट्स प्रिंट करते हैं, आमतौर पर सुरक्षित होते हैं, इन लैम्ब्स से उत्परिवर्तनीय स्थिति तक पहुंचने से डाटा रेस या आश्चर्यजनक व्यवहार हो सकता है क्योंकि लैम्बडा को कई थ्रेडों से एक साथ निष्पादित किया जा सकता है, और उनके प्राकृतिक मुठभेड़ में तत्व नहीं देख सकते हैं आदेश। गैर हस्तक्षेप में न केवल स्रोत के साथ हस्तक्षेप नहीं होता है, बल्कि अन्य भेड़ के साथ हस्तक्षेप नहीं करता है; इस प्रकार की हस्तक्षेप तब उत्पन्न हो सकती है जब एक लैम्ब्डा परिवर्तनीय स्थिति को संशोधित करता है और दूसरा लैम्ब्डा इसे पढ़ता है।

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

यह विशेष रूप से समांतरता से संबंधित है और यह किसी अन्य समवर्ती प्रोग्रामिंग से अलग नहीं है। संशोधित राज्य धागे के बीच दृश्यता के साथ मुद्दों का कारण बन सकता है।

+0

आपके लिए धन्यवाद टिम का उत्तर दें। विशेष रूप से आपके द्वारा लाए गए उद्धरण ने मुझे स्ट्रीम स्रोत के तत्वों की स्थिति को संशोधित करने के बारे में अधिक अनिश्चित महसूस किया है, क्योंकि यह साइड इफेक्ट्स को संशोधित करने के लिए वैध नहीं करता है क्योंकि "मूल्यों को मुद्रित करने वाले डिबगिंग स्टेटमेंट" के रूप में। यह सीधे मेरे मुद्दे से सामना नहीं करता है। – Shay

+1

मुझे लगता है कि अगर आप समानांतर संचालन कर रहे हैं और अधिक संचालन करेंगे तो मार्गदर्शन राज्य को संशोधित नहीं करेगा। –

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