"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > नोटिफाई() या नोटिफाईऑल() के बाद एक थ्रेड हमेशा ऑब्जेक्ट लॉक को पुनः प्राप्त क्यों कर लेता है?

नोटिफाई() या नोटिफाईऑल() के बाद एक थ्रेड हमेशा ऑब्जेक्ट लॉक को पुनः प्राप्त क्यों कर लेता है?

2024-11-16 को प्रकाशित
ब्राउज़ करें:297

Why Does One Thread Always Reacquire the Object Lock After notify() or notifyAll()?

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 buf = new ArrayList();

    public synchronized void put(Object o) {
        while (buf.size() == MAX_SIZE) {
            wait();
        }
        buf.add(o);
        notify();
    }

    public synchronized Object get() {
        while (buf.size() == 0) {
            wait();
        }
        Object o = buf.remove(0);
        notify();
        return o;
    }
}
निर्माता पी1 एक ऑब्जेक्ट को बफर में डालता है।

निर्माता पी2 और पी3 ऑब्जेक्ट डालने का प्रयास करते हैं लेकिन हैं अवरुद्ध है क्योंकि बफ़र भरा हुआ है। पी2 या सी2 को अधिसूचना द्वारा जागृत किया जा सकता है, लेकिन लॉक को पुनः प्राप्त करने का प्रयास करते समय वे दोनों अवरुद्ध हो जाते हैं।

लॉक प्राप्त करने का प्रयास करते समय सी3 भी अवरुद्ध हो जाता है।
  1. परिणाम, सभी तीन थ्रेड अनिश्चित काल तक प्रतीक्षा कर रहे हैं, जिससे गतिरोध पैदा हो रहा है। निर्माता/उपभोक्ता कोड में सूचित करें()। यह सुनिश्चित करता है कि सभी प्रतीक्षा थ्रेड सक्रिय हैं, जिससे गतिरोध को रोका जा सकता है। यदि विशिष्ट परिदृश्य में केवल एक विशिष्ट प्रतीक्षा थ्रेड को जगाने की आवश्यकता होती है, तो सूचित करें() का उपयोग सावधानी के साथ किया जा सकता है।
नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3