2015-04-28 7 views
9

जावा में आप निम्न विधि है।स्थानीय चर और धागा सुरक्षा

अर्थात्: j == foo(j)

लेकिन यदि आप एक से अधिक थ्रेड फोन foo है, तो आप उस j==foo(j) गारंटी ले सकते हैं?

मैं हाँ कहूंगा कि इसकी गारंटी है, क्योंकि i एक स्थानीय चर है, और प्रत्येक धागे का अपना ढेर होता है इसलिए i प्रत्येक थ्रेड के लिए एक अलग स्मृति स्थान होगा।

मैं कहूंगा कि आप की गारंटी नहीं दे सकता है कि j==foo(j) अगर i एक उदाहरण चर रहा है:

private int i; 
public int foo(int n) { 
    i=n; 
    i = i+1; i = i-1; 
    return i; 
} 

क्योंकि धागे बिछा कर सकते और i का मूल्य विधि क्रियान्वित एक धागा के माध्यम से आधे रास्ते को बदल सकते हैं, या एक धागा i बढ़ सकता है, लेकिन इसे कम करने का मौका मिलने से पहले, इसके इनपुट के साथ एक और धागा दो बार बढ़ता है और केवल एक बार घटता है।

+0

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

+0

@biziclop मैं कई incremenents या कमी को समझ सकता हूं लेकिन केवल एक कमी देख रहा है और उस क्रम में एक वृद्धि हुई मुझे समझ में नहीं आता? –

+0

नियम यह है कि 'दो परिचालनों के बीच आदेश देने से पहले एक घटना की अनुपस्थिति में, JVM उन्हें पुन: व्यवस्थित करने के लिए स्वतंत्र है क्योंकि यह प्रसन्न होता है। चूंकि संशोधित धागे में चल रहे कोड और कोड को चलाने वाले कोड के बीच ऐसा कोई संबंध नहीं है, किसी भी क्रम में संशोधनों के परिणाम देखने के लिए पर्यवेक्षण धागे के लिए संभव है। – biziclop

उत्तर

6

मैं हाँ कहूंगा कि इसकी गारंटी है, क्योंकि मैं एक स्थानीय चर है, और प्रत्येक धागे का अपना ढेर है इसलिए मैं प्रत्येक थ्रेड के लिए एक अलग स्मृति स्थान होगा।

बिल्कुल। foo पर प्रत्येक कॉल स्वतंत्र होगा, क्योंकि foo किसी भी साझा स्थिति का उपयोग नहीं कर रहा है।

मैं कहूंगा कि आपको लगता है कि जे == foo (जे) की गारंटी नहीं दे सकता है अगर मैं एक उदाहरण चर

सही फिर से है। लगता है जैसे आपको मूल रूप से सही विचार मिल गया है। (ध्यान दें कि यहां तक ​​कि "वृद्धि" और "कमी" परमाणु संचालन नहीं हैं, इसलिए यदि आपके पास उन परिचालनों को करने वाले कई धागे हैं, तो आप मुश्किल परिस्थितियों में समाप्त हो जाते हैं। यही कारण है कि AtomicInteger मौजूद है।)

+0

... और भले ही वे परमाणु हैं, दृश्यता अभी भी एक मुद्दा होगा। यही कारण है कि 'परमाणु इंटेगर' मौजूद है। – biziclop

+0

@biziclop: हाँ, बिल्कुल। सभी प्रकार की चीजें :) –

+0

धन्यवाद, तो एक सवाल जो कहता है "नीचे दिए गए जावा कोड में [मेरे प्रश्न में पहला कोड], 'j == foo (j)' क्रमिक कार्यक्रमों के लिए है। हालांकि, यदि एकाधिक थ्रेड कॉल ' foo() 'फिर' j == foo (j) 'गलत हो सकता है। समझाओ।"समझ में नहीं आता है? –

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