का अनुचित प्रकाशन निम्न उदाहरण ब्रायन गोएट्ज़, चैप्टे 3, सेक्शन 3.5.1 द्वारा "जावा कंसुरेंसी इन प्रैक्टिस" पुस्तक से है। यह वस्तुओंजावा ऑब्जेक्ट रेफरेंस
class someClass {
public Holder holder;
public void initialize() {
holder = new Holder(42);
}
}
public class Holder {
private int n;
public Holder(int n) { this.n = n; }
public void assertSanity() {
if (n!=n)
throw new AssertionError("This statement is false");
}
}
का अनुचित प्रकाशन का उदाहरण इसमें कहा गया है कि धारक और एक असंगत स्थिति में एक और धागा को दिखाया जा सकता है एक और धागा पर्यवेक्षक एक आंशिक रूप से निर्माण वस्तु सका है। ये केसे हो सकता हे? क्या आप उपर्युक्त उदाहरण का उपयोग कर परिदृश्य दे सकते हैं?
यह भी ऐसे मामले भी हैं कि कहने के लिए जब एक धागा एक बासी मूल्य पहली बार यह एक क्षेत्र है और फिर एक अधिक तक दिनांक मान अगली बार है, जिसके कारण assertSanity अभिकथन त्रुटि फेंक कर सकते हैं पढ़ता देख सकते हैं पर चला जाता है। दावा कैसे फेंक दिया जा सकता है?
भविष्य में पढ़ने से, इस समस्या को ठीक करने का एक तरीका है धारक को 'एन' फाइनल बनाकर अपरिवर्तनीय बनाना है। अभी के लिए, मान लें कि धारक अपरिवर्तनीय नहीं है लेकिन प्रभावी रूप से अपरिवर्तनीय है। इस ऑब्जेक्ट को सुरक्षित रूप से प्रकाशित करने के लिए, क्या हमें धारक प्रारंभिक स्थिर बनाना है और इसे अस्थिर (दोनों स्थिर intialization और अस्थिर या केवल अस्थिर) घोषित करना है? कुछ
public class someClass {
public static volatile Holder holder = new Holder(42);
}
अग्रिम में आपकी सहायता के लिए धन्यवाद।
मैं बस देख सकता हूं कि एक मल्टीप्रोसेसर स्थिति में दो प्रोसेसर के बीच असंगत कैश स्थिति की संभावना है। जब तक आप सिंक्रनाइज़ करने के लिए स्पष्ट कदम नहीं उठाते, तब तक यह एक गैर-कड़े-युग्मित एमपी पर्यावरण में हमेशा एक संभावना है। –
http://www.ibm.com/developerworks/java/library/j-jtp0618/ उपयोगी हो सकता है। –
@PaulGrime - एक संक्षिप्त समीक्षा के बाद मैंने उपरोक्त परिदृश्य को संबोधित करने वाले कुछ भी नहीं देखा। वस्तु का निर्माण करने से पहले संदर्भ "भागने" नहीं है। Int 'n' सार्वजनिक नहीं है और कक्षा के बाहर नहीं देखा जा सकता है। –