2013-02-09 8 views
8

पुस्तक जावा संगामिति से की सुरक्षित प्रकाशन के लिए अस्थिर guaranntee w.rt अंतिम:बनाम व्यवहार में वस्तुओं

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

  • एक स्थिर प्रारंभकर्ता

  • एक अस्थिर क्षेत्र या AtomicReference

  • एक भंडारण में इसे करने के लिए एक संदर्भ के भंडारण से एक वस्तु संदर्भ शुरु कर रहा है: एक ठीक से निर्माण वस्तु सुरक्षित रूप से प्रकाशित किया जा सकता है उचित रूप से निर्मित ऑब्जेक्ट

  • सेंट के अंतिम क्षेत्र में इसका संदर्भ
    लॉक द्वारा उचित रूप से संरक्षित क्षेत्र में इसका संदर्भ देना।

मेरे प्रश्न हैं:

  1. बुलेट बिंदुओं 2 और 3 के बीच क्या अंतर है? ऑब्जेक्ट के सुरक्षित प्रकाशन के संदर्भ में volatile दृष्टिकोण और final दृष्टिकोण के बीच अंतर में मुझे रूचि है।
  2. बिंदु 3 में ठीक से निर्मित ऑब्जेक्ट के अंतिम फ़ील्ड का क्या मतलब है? बुलेट पॉइंट्स शुरू करने से पहले लेखकों ने पहले ही उल्लेख किया है कि वे एक उचित ढंग से निर्मित ऑब्जेक्ट के बारे में बात कर रहे हैं (जो मुझे लगता है कि this भागने के संदर्भ को नहीं दे रहा है)। लेकिन एक बार फिर उन्होंने सही ढंग से निर्मित वस्तुओं के बारे में क्यों उल्लेख किया?

उत्तर

7

बुलेट बिंदु 2 और 3 के बीच अंतर क्या हैं?

  • volatile मूल रूप से इसका मतलब है कि क्षेत्र के लिए किसी भी राईट अन्य धागे से दिखाई जाएगी। तो जब आप अस्थिर के रूप में फ़ील्ड घोषित करते हैं: private volatile SomeType field;, आपको गारंटी है कि यदि निर्माता उस क्षेत्र को लिखता है: field = new SomeType();, यह असाइनमेंट अन्य थ्रेडों द्वारा दिखाई देगा जो बाद में field पढ़ने की कोशिश करते हैं।
  • final में काफी समान अर्थशास्त्र हैं: आपके पास गारंटी है कि यदि आपके पास अंतिम फ़ील्ड है: private final SomeType field; उस फ़ील्ड को लिखें (या तो घोषणा या कन्स्ट्रक्टर में): field = new SomeType(); फिर से नहीं किया जाएगा और अन्य द्वारा दिखाई देगा धागे यदि वस्तु ठीक से प्रकाशित है (यानी उदाहरण के लिए this का कोई भाग नहीं है)।

जाहिर है, मुख्य बात यह है कि यदि फ़ील्ड अंतिम है, तो आप इसे केवल एक बार असाइन कर सकते हैं।

बिंदु 3 में उचित ढंग से निर्मित ऑब्जेक्ट के अंतिम क्षेत्र से उसका क्या अर्थ है?

, उदाहरण के लिए, आप निर्माता से this भागने, अंतिम अर्थ विज्ञान द्वारा प्रदान की गारंटी चला गया है चलो: एक अवलोकन धागा उसके डिफ़ॉल्ट मान (एक वस्तु के लिए नल) के साथ मैदान देख सकते हैं। यदि वस्तु ठीक तरह से बनाई गई है तो यह नहीं हो सकता है।


काल्पनिक उदाहरण:

class SomeClass{ 
    private final SomeType field; 

    SomeClass() { 
     new Thread(new Runnable() { 
      public void run() { 
       SomeType copy = field; //copy could be null 
       copy.doSomething(); //could throw NullPointerException 
      } 
     }).start(); 
     field = new SomeType(); 
    } 
} 
+0

हैं निर्माण के बाद मैं 'field.setX (new X())' जैसे फ़ील्ड द्वारा प्रस्तुत ऑब्जेक्ट की स्थिति को बदलता हूं, क्या यह परिवर्तन अन्य धागे द्वारा देखा जाने पर भी गारंटी देता है जब हम इसे अस्थिर घोषित करते हैं? या यह केवल प्रारंभिक सुरक्षा देता है? इस मामले में फाइनल के बारे में क्या? – Geek

+0

नहीं, केवल 'फ़ील्ड' आपको दृश्यता (पुनः) असाइनमेंट पर दृश्यता गारंटी देता है। जब तक 'x' भी अस्थिर नहीं होता है,' field.x = नया X(); '(या आपका सेटर उदाहरण) ऐसी कोई गारंटी प्रदान नहीं करता है। – assylias

+0

समान रूप से अंतिम के लिए चला जाता है, संक्षेप में कि यदि 'फ़ील्ड' के सभी सदस्य भी अंतिम हैं और अपरिवर्तनीय हैं, तो 'फ़ील्ड' अपरिवर्तनीय है और इसलिए थ्रेड सुरक्षित है। – assylias

1

आप क्या पढ़ना चाहिए कभी नहीं क्या volatile बनाम final प्रकाशित करने, कि final को छोड़कर के प्रभाव केवल निर्माता में एक बार सेट किया जा सकता में कोई अंतर नहीं है, और इस तरह परिवर्तन।

मेरा मानना ​​है कि एक ठीक से निर्माण वस्तु वास्तव में है क्या आप के लिए, एक वस्तु जिसका this संदर्भ अपने निर्माता से बच नहीं किया था और थ्रेड में कोई सुरक्षित तरीके से प्रकाशित किया गया है कि यह प्रयोग किया जाता है देखें।