2010-11-19 17 views
5

मैं यह देखने में सिंक्रनाइज़ (धागा), तो सूत्र = बातिल:क्या यह ठीक है? सिंक ब्लॉक

// thread is a member of this class 

synchronized(this.thread) 
{ 
    this.thread.running = false; 
    this.thread.notifyAll(); // Wake up anything that was .waiting() on 
    // the thread 
    this.thread = null; // kill this thread reference. 
    // can you do that in a synchronized block? 
} 

यह thread=null स्थापित करने के लिए, जबकि अभी भी उस पर एक ताला रखते हुए ठीक है?

मुझे यह बीबी कोड में थोड़ा सा पता चला।

+1

क्या कोई कारण है कि आप Thread.interrupt() का उपयोग नहीं कर रहे हैं क्योंकि यह अंतर्निहित पुस्तकालयों द्वारा समर्थित है? –

उत्तर

7

हाँ, यह ठीक है। सिंक्रनाइज़ कथन संदर्भ की एक प्रतिलिपि लेगा कि यह लॉक हो रहा है, और अंत में अनलॉक करने के लिए काम करने के लिए प्रतिलिपि का उपयोग करें।

जावा भाषा विशिष्टता की Section 14.19 वास्तव में इस बारे में स्पष्ट नहीं है, लेकिन यह करता राज्य कि अभिव्यक्ति शुरू में मूल्यांकन किया जाता है - और बाद में इसे फिर से मूल्यांकन करने का उल्लेख नहीं है।

synchronized(this.thread) 

this.thread = null; 

आप क्षेत्र फिर नियत कर रहे हैं करने के लिए आप वस्तु पर क्षेत्र this.thread अंक सिंक्रनाइज़ कर रहे हैं:

+0

यह ठीक है, लेकिन यह संदिग्ध है कि नल के थ्रेड संदर्भ को सेट करना एक अच्छा विचार है या नहीं। – Adamski

+1

@Adamski: मैं ईमानदार होने के लिए पहली जगह पर सिंक्रनाइज़ करने पर एक उचित दृढ़ विचार लेता हूं - मैंने सोचा कि मैं उसमें जाने से बचूंगा :) –

+0

सहमत - वास्तव में इंटेलिजे ने मुझे इस स्थिति में सिंक्रनाइज़ करने के बारे में चेतावनी दी एक गैर-अंतिम चर। प्रविष्टि पर – Adamski

3

एक अंतर नहीं है। आप उपरोक्त संदर्भित ऑब्जेक्ट के साथ कुछ भी नहीं कर रहे हैं, इसलिए लॉक अभी भी मान्य है।

0

आप इसे कर सकते हैं, लेकिन यह लगभग निश्चित है कि कोड जो भी हासिल करने की कोशिश कर रहा है उसके लिए गलत है। संपूर्ण कोड पोस्ट करें, और मैं गारंटी देता हूं कि यह स्पष्ट रूप से प्रोग्रामर समरूपता को समझ में नहीं आता है।

सिंक्रनाइज़ेशन के लिए उपयोग किए जाने वाले चर को पुन: असाइन न करें।

0

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

1

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

+0

'मूल्यांकन'। – EJP

+3

@EJP मूल्यांकन से अधिक - एक अभिव्यक्ति जो शून्य के मूल्यांकन करती है, वह NullPointerException का कारण नहीं बनती है। –

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