2011-06-22 14 views
8

मैं नीचे मेरी कोड में एक वस्तु पर सिंक्रनाइज़ करने के लिए करने की कोशिश की:NullPointerException

public void myMethod() { 
    synchronized (globalObj) { 
     //Do something here 
    } 
} 

कोड एक थ्रेड में मार डाला गया है। मुद्दा यह है कि, एक और धागा 'globalObj' को शून्य में सेट कर सकता है। फिर, 'सिंक्रनाइज़ (globalObj)' NullPointerxception को फेंक देगा जब 'globalObj' को अन्य थ्रेड द्वारा शून्य पर सेट किया गया है।

किसी ऑब्जेक्ट पर सिंक्रनाइज़ करने का सबसे अच्छा अभ्यास क्या है ताकि NullPointerException फेंक नहीं दिया जाएगा?

धन्यवाद।

+0

अधिक कोड कृपया। –

उत्तर

25

आपको उस संदर्भ पर सिंक्रनाइज़ नहीं करना चाहिए जो स्वयं ही बदला जा सकता है। यदि globalObj को प्रतिस्थापित करने के लिए किसी अन्य थ्रेड की अनुमति है, तो इसका मतलब है कि आप पुराने globalObj पर लॉक रख सकते हैं जबकि दूसरा धागा पूरी तरह से अलग-अलग काम करता है - लॉक आपकी मदद नहीं करता है। - कोई समस्या नहीं

static final Object lockObj = new Object(); 

public void myMethod() { 
    synchronized (lockObj) { 
    // do something with globalObj here 
    } 
} 

lockObj के बाद से कभी नहीं बदलता है, तो आप हमेशा एक ही ताला का उपयोग करेंगे:

क्या आप के बजाय क्या करना चाहिए इस उद्देश्य के लिए एक अलग Object है।

1

सुनिश्चित करें कि आप एक वस्तु है कि नल नहीं हो सकता पर सिंक्रनाइज़ करें ...

क्यों आप शून्य पर globalObj की स्थापना कर रहे हैं? इसके लिए समवर्ती अर्थशास्त्र क्या होना चाहिए? क्या यह दुर्घटना से है?

यदि लॉक की आवश्यकता कभी-कभी दूर होती है (हालांकि अजीब लगती है), तो आप एक शून्य जांच जोड़ सकते हैं (बेशक, आपको शून्य के लिए पहली जांच की दौड़ की स्थिति से बचने के लिए कुछ और सिंक्रनाइज़ करने की आवश्यकता होगी, और फिर इसे तुरंत बाद में शून्य करने के लिए सेट)।

कृपया अपने परिदृश्य का विस्तार अधिक विस्तार से करें।

0

एक निजी ऑब्जेक्ट क्लास सदस्य बनाएं जिसमें कोई सार्वजनिक सेटर्स न हो और उस पर लॉक न हो।

6

आप null संदर्भ पर सिंक्रनाइज़ नहीं कर सकते हैं। सबसे अच्छा अभ्यास final ऑब्जेक्ट पर सिंक्रनाइज़ करना है (यह सुनिश्चित करने के लिए कि यह कभी भी null नहीं है), या (बेहतर अभी भी) java.util.concurrent पैकेजों में उच्च स्तरीय समवर्ती abstractions का उपयोग करें।

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