2011-06-07 11 views
16

किसी ऑब्जेक्ट पर थ्रेड wait से पहले, उसे उस ऑब्जेक्ट पर मॉनीटर प्राप्त करना होगा। मॉनिटर को तब जारी किया जाता है, और धागा जागने के बाद इसे फिर से हासिल करने का प्रयास करता है।जावा: जब ऑब्जेक्ट किसी ऑब्जेक्ट पर प्रतीक्षा करता है तो सभी मॉनीटर जारी किए जाते हैं?

लेकिन wait पर कॉल करते समय थ्रेड के अन्य मॉनीटरों के साथ क्या होता है?

इस उदाहरण पर विचार:

 
    Object a = // ... 
    Object b = // ... 

    synchronized(a) 
    { 
     synchronized(b) 
     { 
      b.wait(); 
      // continue 
     } 
    } 

धागा b.wait() आवश्यकता होने पर, यह दोनोंa और b, या केवल b पर ताले जारी करेंगे?

उत्तर

15

केवल b

इस प्रकार के प्रश्नों के लिए आधिकारिक स्रोत जावा भाषा विशिष्टता है। इस मामले में प्रासंगिक अनुभाग 17.8 Wait Sets and Notification है: धागा

चलो टी हो धागा वस्तु मीटर पर इंतजार विधि को क्रियान्वित करने, और nटी द्वारा ताला क्रियाओं की संख्या हो m पर जो अनलॉक क्रियाओं से मेल नहीं खाती हैं। निम्न में से एक क्रिया होती है।

  • [...]
  • अन्यथा, निम्न क्रम होता है:

    1. थ्रेड टी वस्तु मीटर की प्रतीक्षा सेट में जोड़ा जाता है, और करता है n अनलॉक क्रिया एम पर।
    2. [...]
7

AFAIK केवल बी। यह deadlocks का एक क्लासिक स्रोत है।

10

Object class के जावा API दस्तावेज़ से:

वर्तमान धागा इस वस्तु की निगरानी के स्वामी होना चाहिए। धागा इस पर नजर रखने के की स्वामित्व विज्ञप्ति और इंतजार कर रहा है जब तक एक और धागा धागे को विधि या notifyAll विधि को सूचित या तो एक फोन के माध्यम से जगाने के लिए इस वस्तु के मॉनीटर पर इंतजार कर सूचित करता है। तब थ्रेड तब तक प्रतीक्षा करता है जब तक यह मॉनिटर के स्वामित्व को फिर से प्राप्त नहीं कर सकता और निष्पादन को फिर से शुरू करता है।

तो, b.wait() विज्ञप्ति केवल b पर ताला बुला।

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