2010-10-19 9 views
12

आदेश देने से पहले क्या होता है मैं दो धागे हैं:वाष्पशील चर और

थ्रेड: 1

a = 1; 
x = b; 

थ्रेड: 2

b = 1 
y = a 

यहाँ एक और ख अस्थिर घोषित कर रहे हैं। मुझे समझ में नहीं आया कि एक = 1 के बीच "होता है" किनारा कैसे बनाया जाता है; और वाई = ए; और एक्स = बी के बीच; और बी = 1;

मैं समझता हूं कि अस्थिर चर का उपयोग करके कोई थ्रेड कैश से पुराने मूल्यों को पढ़ने से रोक सकता है। लेकिन ऑर्डर करने से पहले अस्थिर चर सुनिश्चित कैसे हो सकता है।

विशेष रूप से, मैं यह समझ नहीं आया:

एक अस्थिर क्षेत्र के लिए एक लिखने एक ही क्षेत्र के हर बाद पढ़ने से पहले होता है।

क्या यह काम करता है?

+0

इस हालिया प्रश्न और कई प्रासंगिक जानकारी के लिए उत्तर देखें: http://stackoverflow.com/questions/3964317/memory-barriers-and-coding-style-over-a-java-vm – andersoj

उत्तर

15

एक अस्थिर क्षेत्र को लिखने के लिए एक ही क्षेत्र के हर बाद पढ़ने से पहले होता है।

यहां महत्वपूर्ण शब्द "बाद" है।

यहाँ जावा भाषा विशिष्टता 17.4.4 Synchronization Order के प्रासंगिक सा है:

हर निष्पादन एक तुल्यकालन आदेश है। एक सिंक्रनाइज़ेशन ऑर्डर निष्पादन के सभी सिंक्रनाइज़ेशन क्रियाओं पर कुल ऑर्डर होता है। प्रत्येक थ्रेड टी के लिए, टी में सिंक्रनाइज़ेशन क्रियाओं (§17.4.2) का सिंक्रनाइज़ेशन ऑर्डर टी के प्रोग्राम ऑर्डर (§17.4.3) के साथ संगत है। तुल्यकालन कार्यों के लिए प्रेरित सिंक्रनाइज़-साथ कार्यों पर संबंध, परिभाषित इस प्रकार है:

  • [...]
  • एक अस्थिर चर के लिए एक लिखने बाद के सभी के साथ सिंक्रनाइज़-(§8.3.1.4) वी के पढ़ता v किसी भी थ्रेड द्वारा (जहां बाद में सिंक्रनाइज़ेशन ऑर्डर के अनुसार परिभाषित किया गया है)।

अंतिम भाग नोट करें। तो यह कह रहा है कि यदि आप कार्यक्रम के कार्यों के किसी भी क्रम पर विचार करते हैं, तो एक अस्थिर चर के किसी भी पठन जो बाद में लिखने की तुलना में कुल क्रम में आता है, वह लिखने को "याद नहीं कर सकता"।

+0

"* प्रत्येक के लिए थ्रेड टी *, सिंक्रनाइज़ेशन क्रियाओं का सिंक्रनाइज़ेशन ऑर्डर ... "स्वयं द्वारा अस्थिरता धागे के बीच सिंक्रनाइज़ेशन ऑर्डर निर्धारित नहीं करता है? –

+0

मेरे पास भी वही प्रश्न है। जावा स्पेस को थोड़ा सा गूढ़ ढूँढना। – devnull

+1

@pst: अस्थिर एक विशिष्ट थ्रेड के क्रम के बजाय * कुल * ऑर्डर पर काम करता है। इसका प्रभावी अर्थ यह है कि कोई थ्रेड एक अस्थिर चर नहीं पढ़ सकता है, यह जांच किए बिना कि कोई अन्य थ्रेड लिखने के लिए क्या किया गया है। –

3

एक अस्थिर क्षेत्र के लिए एक लेख हर बाद एक ही क्षेत्र के पढ़ने से पहले होता है।

यह पाठ भ्रमित करने वाला है। यह लिखने से पहले होता है-लिखने से पहले होता है-पहले संबंधों को सीमित करता है! यह केवल इतना कहता है कि इसके बाद होता है, वास्तव में बाद में होता है।

दूसरे शब्दों में, क्या यह कहने की कोशिश कर रहा है कि पढ़ने लिखने के दौरान होता है नहीं, और भी है कि अगर वहाँ अन्य रहे हैं होता है-पहले रिश्तों कि पढ़ने लिखने के बाद क्या करने के लिए कारण, वह यह है कि पढ़ना उस लेखन का मूल्य होगा।

जेएलएस अनुभाग 17.4.4 Synchronization Order देखें जो इस संदर्भ में "बाद में" शब्द को परिभाषित करता है।

3

विश्लेषण करने के लिए, पहले आप सभी संभावित सिंक्रनाइज़ेशन ऑर्डर सूचीबद्ध करते हैं। वे प्रोग्रामिंग आदेश के साथ संगत होना चाहिए। आपके उदाहरण में, 6 संभावित आदेश हैं।

1  2  3  4  5  6 
w(a) w(a) w(b) w(a) w(b) w(b) 
r(b) w(b) w(a) w(b) w(a) r(a) 
w(b) r(b) r(b) r(a) r(a) w(a) 
r(a) r(a) r(a) r(b) r(b) r(b) 

प्रत्येक आदेश संबंधों से पहले कुछ होता है। (1) में, हमारे पास w (ए) होता है- आर (ए) से पहले। में (6), हमारे पास w (बी) होता है- आर (बी) से पहले। में (2) - (5), हमारे पास दोनों हैं।

प्रत्येक संभावित आदेश के लिए, इसके द्वारा स्थापित होने वाले पहले संबंधों को देखते हुए, आपको निष्पादन का विश्लेषण करने की आवश्यकता है ताकि यह सुनिश्चित किया जा सके कि यह वही है जो आप चाहते हैं।

यदि यह बहुत कठिन लगता है, तो यह है। वास्तविक जीवन में, हम आम तौर पर सरल परिस्थितियों से खुद को सीमित करते हैं, जहां केवल एक वस्तु को लॉक/रिलीज़ किया जाता है, या केवल एक अस्थिर चर को पढ़ और लिखना होता है। तो यह बहुत जटिल नहीं है।