2012-12-03 30 views
16

में एक अस्थिर स्मृति-बाधा को लिखना है, मैंने हाल ही में एक बात में सुना है कि एक अस्थिरता को लिखने के लिए थ्रेड ने लिखा है कि प्रत्येक चर के लिए एक स्मृति-बाधा ट्रिगर करता है। क्या यह वास्तव में सही है? जेएलएस से, ऐसा लगता है कि केवल संबंधित चर ही बाहर निकलता है, लेकिन दूसरों को नहीं। क्या कोई जानता है कि वास्तव में क्या सही है? क्या कोई मुझे जेएलएस में एक ठोस स्थान बता सकता है?जावा

+1

जेएलएस की मेरी व्याख्या आपके साथ सहमत है। – NPE

+1

[अस्थिर चर और अन्य चर] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/12438464/volatile-variables-and-other-variables) – assylias

+0

जैसा कि उत्तर स्पष्ट करता है, यह केवल वैरिएबल नहीं है जिसे अस्थिर घोषित किया गया है लेकिन सभी लिखते हैं कि अस्थिर लेखन से पहले हुआ था। – sjlee

उत्तर

1

Volatile variables and other variables के संदर्भ में सही था। मुझे एहसास नहीं हुआ कि पहले की पारगमनशीलता कुछ ऐसा है जो वीएम द्वारा लागू किया जाना चाहिए, परिभाषा से कुछ ऐसा नहीं है। मैं अभी भी परेशान हूं कि इतने दूरगामी परिणामों के साथ कुछ स्पष्ट रूप से क्यों नहीं बताया गया है लेकिन वास्तव में कुछ परिभाषाओं से एक अनुशासनिक है। लपेट अप करने के लिए: मान लीजिए आप 4 कार्यों इस तरह है:।

thread1  thread2 
a1 
a2 
       a3 
       a4 

जहां a2 एक अस्थिर चर वी और ए 3 करने के लिए एक लिखने है एक ही अस्थिर चर v से पढ़ने है यह definiton के होता है से इस प्रकार है - पहले (एचबी) कि एचबी (ए 1, ए 2) और एचबी (ए 3, ए 4)। इसके अलावा, वाष्पशीलता के लिए हमारे पास एचबी (ए 2, ए 3) है। यह अब एचबी (ए 1, ए 3) एचबी की आवश्यक पारगमनशीलता से आता है। तो अस्थिर परिवर्तनीय v के लिखने और बाद में पढ़ने के लिए स्मृति बाधा के रूप में कार्य करता है।

16

हां, यह बाधा शुरू करेगा। आप here पढ़ सकते हैं। 4 प्रकार हैं, लोड लोड लोडस्टोर स्टोरस्टोर स्टोर लोड।

जहां तक ​​आपके प्रश्न

JLS से, ऐसा लगता है कि केवल चर का संबंध प्लावित हो जाता है बाहर, लेकिन दूसरों। क्या कोई जानता है कि वास्तव में क्या सही है?

सभी लिखते हैं कि एक अस्थिर स्टोर से पहले होता है यह अनुमान लगाता है कि अन्य धागे इस नए स्टोर को लोड करते हैं। हालांकि, लिखते हैं कि एक अस्थिर लोड से पहले होता है या अन्य धागे द्वारा नहीं देखा जा सकता है अगर वे नया मान लोड नहीं करते हैं।

एक व्यावहारिक उदाहरण के लिए

volatile int a =0; 
int b = 0; 

Thread-1 
b = 10; 
a = 3; 

Thread-2 
if(a == 0){ 
    // b can b 10 or 0 
} 
if(a == 3){ 
    // b is guaranteed to be 10 (according to the JMM) 
} 
+1

+1 * "भविष्यवाणी के साथ कि अन्य धागे इस नए स्टोर को लोड करते हैं" * – assylias

+4

मुझे लगता है कि आपका उदाहरण गलत है। थ्रेड -2 को 'बी' के नए मान को देखने के लिए 'a' से 3 की तुलना करने की आवश्यकता नहीं है, यह' a' पढ़ने के लिए पर्याप्त है। तो पहली पंक्ति के तुरंत बाद, थ्रेड-2 को 'बी' के बराबर 10 (सभी शाखाओं में) देखने की गारंटी है। हालांकि, एक तीसरा धागा जो 'ए' को कभी नहीं पढ़ता है उसे 'बी' के नए मूल्य को देखने की गारंटी नहीं है। –

+11

@ फिलिपवेन्डलर मुझे लगता है कि बिंदु था: अगर एक == 0, लिखना 'ए = 3' अभी तक नहीं हुआ है और बी कुछ भी हो सकता है, जिसमें 10 शामिल हैं। यदि कोई == 3, लिखना' ए = 3' हुआ है और आपको बी == 10. – assylias