मैं एक विशिष्ट सेवा शुरू करने वाले सिस्टम के कुछ हिस्सों को सूचित करने के लिए एक बूलियन रखना चाहता हूं।सिंक्रनाइज़ ऑब्जेक्ट को सूचित करने से पहले थ्रेड द्वारा लॉक नहीं किया गया है सभी()
कुछ अजीब कारणों से मुझे त्रुटि java.lang.IllegalMonitorStateException: object not locked by thread before notifyAll()
मिल रही है।
अजीब बात यह है कि अधिसूचना सभी() एक सिंक्रनाइज़ ब्लॉक के अंदर है जो उस ऑब्जेक्ट पर नियंत्रण लेता है जिसे मैं सूचित करता हूं सभी() चालू।
मेरी कक्षा इस तरह शुरू होता है:
public class MyService {
public static Boolean notifier = Boolean.valueOf(false);
@Override
public void start() {
synchronized (MyService.notifier) {
MyService.notifier = Boolean.valueOf(true);
MyService.notifier.notifyAll();
}
}
@Override
public void stop() {
synchronized (MyService.notifier) {
MyService.notifier = Boolean.valueOf(false);
MyService.notifier.notifyAll();
}
}
...
}
मैं एक Android आवेदन पर काम कर रहा हूँ। मुझे नहीं लगता कि इसे किसी भी चीज़ को प्रभावित करना चाहिए, लेकिन मैं उस टिप्पणी के साथ इस सवाल का पूरक हूं कि जावा काम करने के तरीके को प्रभावित करता है।
अगर ऑब्जेक्ट सिंक्रनाइज़ किए गए ब्लॉक के अंदर लॉक हो तो मुझे अपवाद क्यों मिल रहा है?
[इस SO प्रश्न] पर एक नज़र डालें [http://stackoverflow.com/questions/260337/why-does-synchronized-notifyall-result-in-a-illegalmonitorstateexception?rq=1) –
क्योंकि मॉनिटर संबंधित है _object_ पर, _field_ पर नहीं। आप 'Boolean.FALSE' पर सिंक्रनाइज़ कर रहे हैं लेकिन' बूलियन.TRUE' (या इसके विपरीत) को सूचित करते हैं। –
कहानी का नैतिक है; एक म्यूटेबल ऑब्जेक्ट को लॉक न करें, सुनिश्चित करें कि यह 'अंतिम' है, आपका कोड जितना जटिल होना चाहिए उससे कहीं अधिक जटिल है, लेकिन मैं यह सुझाव नहीं दे सकता कि आप इसके लिए क्या इंतजार कर रहे हैं इसे देखे बिना इसे प्रतिस्थापित करना है। (जैसा कि यह खड़ा है आप इसे सब हटा सकते हैं) मुझे संदेह है कि एक एक्जिक्यूटर्स सेवा है जिसका उपयोग आप करना चाहिए। –