2012-04-12 17 views
9

क्या इस कोड में अस्थिर और सिंक्रनाइज़ करने के लिए कोई कारण है?एक साथ सिंक्रनाइज़ किए गए अस्थिर

public class Helper { 
    private volatile int n; 
    private final Object lock = new Object(); 
    public Helper(int n) { 
    this.n = n; 
    } 

    public void setN(int value) { 
    synchronized (lock) { 
     n = value; 
    } 
    } 
} 

क्लास हेल्पर थ्रेड सुरक्षित होना चाहिए। मुझे यह उदाहरण "जावा कंसुरेंसी दिशानिर्देश" पुस्तक से मिला है, लेकिन यह अभी भी स्पष्ट नहीं है: इस उदाहरण में अस्थिर और सिंक्रनाइज़ करने का कारण क्या है?

+1

आप किस सटीक पुस्तक के बारे में बात करते हैं? जावा कंसुरेंसी सीखने के लिए मैं प्रैक्टिस बुक (http://jcip.net/) में जावा कंसुरेंसी की दृढ़ता से सलाह दूंगा। –

+0

मुझे यह पुस्तक यहां मिली है (पेज 167) http://www.sei.cmu.edu/reports/10tr015.pdf इस पुस्तक में सबकुछ स्पष्ट है कि इस मामले को छोड़कर केवल –

+0

परमाणु इंटेगर का उपयोग करें। – khachik

उत्तर

7

इस उदाहरण के प्रयोजन करते रहे कि volatile बिना syncronized इस मामले में पर्याप्त तथ्य यह है कि वस्तु unsafely प्रकाशित किया जा सकता (यानी बिना Foo में volatile) नहीं दिया जाता है:

सहायक हैं फू वर्ग में क्षेत्र को अस्थिर घोषित नहीं किया गया है, एन क्षेत्र को अस्थिर घोषित किया जाना चाहिए ताकि एन के प्रारंभिक और सहायक क्षेत्र में हेल्पर के लेखन के बीच एक पूर्व-संबंध संबंध स्थापित किया जा सके। यह दिशानिर्देश "VNA06-J के अनुपालन में है। ऐसा न मानें कि किसी ऑब्जेक्ट संदर्भ को अस्थिर गारंटी देता है कि वह अपने सदस्यों की दृश्यता को पृष्ठ 35 पर देखे। यह केवल तब आवश्यक है जब कॉलर (कक्षा फू) को सहायक अस्थिर घोषित करने के लिए भरोसा नहीं किया जा सके।

यह सही है, लेकिन वे यह प्रदर्शित करने के लिए क्योंकि syncrhonization बिना volatile इस मामले में पर्याप्त है एक बुरा उदाहरण चुना है।

0

मुझे लगता है कि अस्थिर क्योंकि 'एन' निर्माता

+0

हां, लेकिन setN विधि में सिंक्रनाइज़ करने का क्या कारण है? –

+0

ओह सच में? मुझे नहीं पता कि एक ही वस्तु के कन्स्ट्रक्टर को 2 या अधिक धागे से कैसे बुलाया जाए, क्या आप? – hsestupin

+0

मुझे भी पता नहीं है) मेरा सवाल था कि setN विधि में सिंक्रनाइज़ेशन की आवश्यकता क्यों है। यदि एन चर अस्थिर है, तो सेटटर बिना किसी अतिरिक्त सिंक्रनाइज़ेशन के हो सकता है। या नहीं? –

1

यह मूल्य में परिवर्तन के आसपास सिंक्रनाइज़ ब्लॉक डाल करने के लिए आवश्यक नहीं है में सेट है प्रयोग किया जाता है; चूंकि जावा 5 यह अस्थिर चर के लिए "स्वचालित रूप से" किया जाता है। मुझे लगता है कि जावा 5 के पिछले, यह आवश्यक नहीं था।

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