2012-03-24 17 views
55

जावा थ्रेड के बारे में लेख पढ़ने पर, मुझे अक्सर अभिव्यक्ति दिखाई देती है: "वर्तमान धागा इस ऑब्जेक्ट के मॉनीटर का मालिक है"। मुझे अर्थ मिलता है: थ्रेड को ऑब्जेक्ट पर काम करने का अधिकार मिलता है। लेकिन मुझे परेशान है कि हम "ऑब्जेक्ट लॉक" के बजाय "ऑब्जेक्ट मॉनीटर" वाक्यांश का उपयोग क्यों करते हैं?जावा में ऑब्जेक्ट की मॉनिटर का क्या अर्थ है? इस शब्द का प्रयोग क्यों करें?

संक्षेप में, मुझे 'मॉनीटर' शब्द का अर्थ नहीं पता है प्रश्न अजीब और सरल हो सकता है। लेकिन मेरी इच्छा है कि कोई भी इसे हल करने में मदद कर सके। 3ks

+1

+1 @ulmangt वास्तव में आपके प्रश्न का उत्तर देने के लिए एकमात्र व्यक्ति होने के लिए: हम उन्हें "मॉनीटर" कहते हैं क्योंकि होरे ने उन्हें 1 9 74 में वापस बुलाया था। –

उत्तर

36

लेकिन मुझे परेशान है कि "वस्तु का मॉनिटर" शब्द "ऑब्जेक्ट लॉक" का उपयोग क्यों करें?

इस संदर्भ में उपयोग किए गए "मॉनिटर" शब्द की व्याख्या करने वाले लिंक के लिए उलमंग का उत्तर देखें।

"लॉक" के बजाय "मॉनिटर" शब्द का उपयोग क्यों करें? कड़ाई से बोलते हुए, शब्दों का मतलब अलग-अलग चीजों का होता है ... विशेष रूप से यदि आप उनका उपयोग इस तरीके से करते हैं कि वे मूल रूप से उपयोग किए जाने का इरादा रखते थे।

  • एक "लॉक" अधिग्रहण और रिलीज प्राइमेटिव्स के साथ कुछ है जो कुछ लॉक गुणों को बनाए रखता है; जैसे विशेष उपयोग या एकल लेखक/एकाधिक पाठक।

  • एक "मॉनिटर" एक तंत्र है जो सुनिश्चित करता है कि केवल एक थ्रेड किसी भी समय दिए गए किसी भी अनुभाग (या अनुभाग) को निष्पादित कर सकता है। इसे लॉक (और "कंडीशन वेरिएबल्स" का उपयोग करके कार्यान्वित किया जा सकता है जो थ्रेड को प्रतीक्षा करने की अनुमति देता है या अन्य थ्रेडों को नोटिफिकेशन भेजता है), लेकिन यह सिर्फ लॉक से अधिक है। दरअसल, जावा मामले में, मॉनिटर द्वारा उपयोग किया जाने वाला वास्तविक लॉक सीधे पहुंच योग्य नहीं होता है। (तुम सिर्फ यह नहीं कह सकते "Object.lock()" यह अधिग्रहण ... जैसे आप एक जावा Lock उदाहरण के साथ कर सकते हैं से अन्य धागे को रोकने के लिए।)

संक्षेप में, अगर एक पंडिताऊ होने के लिए थे जावा मॉनिटरिंग की विशेषता के लिए "मॉनीटर" वास्तव में "लॉक" से बेहतर शब्द है। लेकिन व्यवहार में, दोनों शर्तों का लगभग एक दूसरे के लिए उपयोग किया जाता है।

+1

बहुत डैटल.बहुत धन्यवाद। – jiafu

+0

मेरे पास एक और सवाल है। प्रत्येक ऑब्जेक्ट में हेप डेटा में हाउसकेपर फ़ील्ड में स्वयं की लॉक जानकारी होती है। इसके लिए क्या उपयोग है? – jiafu

+0

@jiafu - यह जरूरी है क्योंकि जावा भाषा निर्दिष्ट है। लेकिन व्यवहार में, ओवरहेड आम तौर पर 1 शब्द से कम होता है ... जब तक ऑब्जेक्ट का लॉक वास्तव में उपयोग नहीं किया जाता है। –

18

एक मॉनीटर केवल उस ऑब्जेक्ट के लिए एक शब्द है जिसका बहुमत वाले वातावरण में विधियों का सुरक्षित रूप से उपयोग किया जा सकता है। आप नीचे स्क्रॉल, तो यह भी एक section explicitly about Java मिला है

http://en.wikipedia.org/wiki/Monitor_(synchronization)

,:

वहाँ पर नज़र रखता है पर एक बड़ा विकिपीडिया लेख है।

4

प्रत्येक ऑब्जेक्ट में कुछ प्रकार का मॉनीटर बनाया गया है, जो इसे किसी कोड द्वारा उपयोग करने की प्रतीक्षा कर रहा है। हकीकत में, अधिकांश वस्तुओं को मॉनिटर के रूप में कभी भी उपयोग नहीं किया जाता है, इसलिए मॉनीटर को तब तक नहीं बनाया जाना चाहिए जब तक उनका उपयोग नहीं किया जाता है। इस सुविधा को लागू करने के बजाय प्रत्येक ऑब्जेक्ट के पास एक निजी मॉनीटर मॉनीटर फ़ील्ड है, इसके बारे में सोचें कि इसे वैश्विक हैश मैप मॉनीटर वाले जेवीएम के रूप में कार्यान्वित किया जा रहा है।

एक संभावित कार्यान्वयन यह है: जब भी एक सिंक्रनाइज़ ब्लॉक दर्ज किया जाता है, तो JVM मानचित्र (मॉनीटर) में सिंक्रनाइज़ ऑब्जेक्ट को देखता है। अगर इसे पाता है, तो यह मॉनीटर का उपयोग करने के लिए मिलता है। यदि यह नहीं मिलता है, तो यह मानचित्र को समर्पित एक महत्वपूर्ण खंड में प्रवेश करता है। फिर यह ऑब्जेक्ट को फिर से देखता है क्योंकि एक और थ्रेड ने इसे पिछले चेक के बीच बनाया और महत्वपूर्ण अनुभाग में प्रवेश किया हो सकता है।यदि यह अभी भी नहीं है, तो यह सिंक्रनाइज़ ऑब्जेक्ट के लिए मॉनीटर बनाता है और महत्वपूर्ण अनुभाग

+0

आपकी सहायता के लिए 3ks – jiafu

5

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

synchronized (object) { 
    while (<condition does not hold>) 
     object.wait(timeout); 
    ... // Perform action appropriate to condition 
} 
1

जावा वर्चुअल मशीन मल्टीथ्रेडिंग का समर्थन करने के लिए मॉनीटर का उपयोग करता है। मॉनीटर इसे दो अवधारणाओं के माध्यम से प्राप्त करते हैं - थ्रेड चलाने के दौरान म्यूचुअल बहिष्करण (यहां वह जगह है जहां 'लॉकिंग' चित्र में आती है) और इंटर थ्रेड संचार के साधन के रूप में समन्वय (यहां वह जगह है जहां ऑब्जेक्ट का इंतजार है और विधियों को चित्र में आते हैं)।

https://www.artima.com/insidejvm/ed2/threadsynchP.html

0

भले ही यह देर हो चुकी है इस जवाब देने के लिए -

"इनसाइड JVM" से निम्नलिखित हिस्सा पढ़ना इस संदेह को दूर कर लेंगे, यह बहुत अच्छी तरह से यहाँ पर (अध्याय 20, धागा तुल्यकालन) में विस्तार से बताया है सवाल, मैंने सोचा कि मामले में बस यह उपयोगी है।
यहाँ एक अनसिंक्रनाइज़्ड जावा विधि

public void add(int value){ 
synchronized(this){ 
     this.count += value; 
    } 
} 

उदाहरण में अंदर जावा कोड का एक सिंक्रनाइज़ ब्लॉक "यह", प्रयोग किया जाता है जो उदाहरण ऐड पद्धति पर कहा जाता है है। एक सिंक्रनाइज़ आवृत्ति विधि ऑब्जेक्ट का उपयोग करती है जो यह मॉनिटर ऑब्जेक्ट के रूप में होती है।
=> एक ही मॉनिटर ऑब्जेक्ट पर सिंक्रनाइज़ किए गए जावा कोड ब्लॉक के अंदर केवल एक थ्रेड निष्पादित हो सकता है।

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