notify() और notifyAll() के बीच सूक्ष्म अंतर
जबकि Notify() और NotifyAll() के बीच प्राथमिक अंतर निहित है उनके द्वारा जगाए जाने वाले प्रतीक्षा धागों की संख्या (एक बनाम सभी), इससे एक और प्रश्न उठता है:
एक धागा हमेशा ऑब्जेक्ट लॉक को पुनः प्राप्त क्यों करता है?
सामान्य तौर पर मामले में, notify() और notifyAll() दोनों यह निर्दिष्ट नहीं करते हैं कि लॉक को पुनः प्राप्त करने के लिए कौन सा प्रतीक्षा थ्रेड चुना जाएगा। जेवीएम या सिस्टम थ्रेड शेड्यूलर यह चयन करता है, जो गैर-नियतात्मक हो सकता है। गतिरोध पैदा हो सकता है, जैसा कि निम्नलिखित उदाहरण से पता चलता है:
प्रोड्यूसर/कंज्यूमर क्लास विद नोटिफाई()
पब्लिक क्लास प्रोड्यूसरकंज्यूमर { निजी अंतिम पूर्णांक MAX_SIZE = 1; // बफर आकार निजी सूची buf = नई ArrayList(); सार्वजनिक सिंक्रनाइज़ शून्य पुट (ऑब्जेक्ट ओ) { जबकि (buf.size() == MAX_SIZE) { इंतज़ार(); } buf.add(o); सूचित करें(); } सार्वजनिक सिंक्रनाइज़ ऑब्जेक्ट प्राप्त करें() { जबकि (buf.size() == 0) { इंतज़ार(); } ऑब्जेक्ट ओ = buf.remove(0); सूचित करें(); वापसी ओ; } }
गतिरोध परिदृश्य:
public class ProducerConsumer { private final int MAX_SIZE = 1; // Buffer size private Listनिर्माता पी1 एक ऑब्जेक्ट को बफर में डालता है।
निर्माता पी2 और पी3 ऑब्जेक्ट डालने का प्रयास करते हैं लेकिन हैं अवरुद्ध है क्योंकि बफ़र भरा हुआ है। पी2 या सी2 को अधिसूचना द्वारा जागृत किया जा सकता है, लेकिन लॉक को पुनः प्राप्त करने का प्रयास करते समय वे दोनों अवरुद्ध हो जाते हैं।
लॉक प्राप्त करने का प्रयास करते समय सी3 भी अवरुद्ध हो जाता है।अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3