2011-09-04 8 views
6

तक पहुंच सिंक्रनाइज़ करें, उन्होंने उल्लेख किया कि यदि कोई विधि स्थिर क्षेत्र को संशोधित करती है, तो आपको इस क्षेत्र तक पहुंच सिंक्रनाइज़ करना होगा, क्योंकि क्लाइंट के लिए बाहरी सिंक्रनाइज़ेशन करने के लिए क्लाइंट संभव नहीं है एक विधी। मुझे समझ में नहीं आता कि क्लाइंट एक स्थिर विधि पर बाहरी सिंक्रनाइज़ेशन कैसे नहीं कर सकता है?जोश ब्लोच द्वारा प्रभावी जावा के आइटम 67 में एक स्थिर क्षेत्र

आंतरिक तुल्यकालन कार्यान्वयन:

public class Serial { 
    private static int serialNumber = 0; 

    public synchronized static void incSerial() { 
     serialNumber++; 
    } 

} 

अगर कोई आंतरिक तुल्यकालन लागू किया, एक ग्राहक बाहर से सिंक्रनाइज़ कर सकते हैं:

synchronize(Serial.class) { 

    Serial.incSerial(); 
} 

किसी भी विचार?

+1

btw, तुम सटीक उद्धरण प्रदान करते हैं और हमें पृष्ठ इस लिखा है बता सकते हैं। मैं उम्मीद करता हूं कि ब्लोच – Bozho

उत्तर

6

एक ग्राहक ऐसा कर सकते हैं, लेकिन आप इस तरह के एक तुल्यकालन के लिए मजबूर नहीं कर सकते। तो कुछ ग्राहक एक अनसंक्रनाइज़ पहुंच सकते हैं, और सबकुछ तोड़ सकते हैं।

+1

अच्छी तरह से स्पष्ट और सही होगा, उदाहरण छोटा होगा - एक क्लाइंट सिंक्रनाइज़ करता है, दूसरा नहीं। इसलिए असीमित कोड का उपयोग कर कई धागे सिंक्रनाइज़ेशन समस्याओं के लिए प्रवण हैं – Bozho

0

आप यकीन है कि तुम वर्ग है कि स्थिर उदाहरण चर धारण के साथ जुड़े लॉक का उपयोग करने की जरूरत है। यदि आप पहले सिंक्रनाइज़ किए गए ब्लॉक के साथ इसे प्राप्त करते हैं और फिर स्थैतिक विधि को कॉल करते हैं, तो यह ठीक है। लेकिन आप इसे क्लाइंट के कोड पर लागू नहीं कर सकते हैं। वे भूल सकते हैं या नहीं जानते कि विशेष स्थिर चर का उपयोग अन्य धागे द्वारा भी किया जाता है। इसलिए बोझो ने सुझाव दिया कि स्थिर विधि को सिंक्रनाइज़ करके और इंस्टेंस वेरिएबल प्राइवेट करना सर्वोत्तम दृष्टिकोण होगा।

Tiberiu

+0

एक और महत्वपूर्ण बात है। उस उद्धरण में ब्लोच ने उल्लेख किया है कि "आपको इस फ़ील्ड तक पहुंच को सिंक्रनाइज़ करना होगा, भले ही इसे एकल थ्रेड द्वारा उपयोग किया जाए"। यदि यह एक धागे द्वारा उपयोग किया जाता है तो इसे सिंक्रोननाइज़ करने की आवश्यकता क्यों होती है? – Hitesh

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