2013-03-04 5 views
5

दोनों कोड नीचे डेडलॉक क्यों नहीं लेते हैं? मेरा मतलब है कि getNumber (।) को कॉल करने के बाद क्लास टेस्ट की ऑब्जेक्ट लॉक होनी चाहिए, इसलिए मुझे getNumber2 (।) तक पहुंचने में सक्षम नहीं होना चाहिए।एक सिंक्रनाइज़ विधि से सिंक्रनाइज़ विधि को कॉल करना, एक ही ऑब्जेक्ट

class Test() { 
    synchronized int getNumber(int i){ 
     return getNumber2(i); 
    } 

    synchronized int getNumber2(int i) { 
     return i; 
    } 

    public static void main(String[] args) { 
     System.out.println((new Test()).getNumber(100)); 
    } 
} 

आउटपुट:

100 
+0

इस तरह की पोस्ट: http://stackoverflow.com/questions/5798637/is-it-safe-to-call-a-synchronized-method-from-another-synchronized-method – Walls

+0

हां सवाल यह वही है , लेकिन संदर्भ यह काफी अलग है। इस सवाल पर यह मृत ताला के बारे में पूछ रहा था, दूसरा एक धागा सुरक्षित है। – Lovera

उत्तर

19

यह वह जगह है ताला फिर से प्रवेशी है क्योंकि, जिसका अर्थ है कि यह एक ही धागे से कई बार प्राप्त किया जा सकता।

Java tutorial से:

रैत्रांत तुल्यकालन

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

JLS की प्रासंगिकता का §17.1. Synchronization है:

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

4

यह एक गतिरोध के लिए नेतृत्व नहीं करता है, क्योंकि जब एक धागा एक तुल्यकालन विधि दर्ज करते हैं, यह क्या करता है जाँच कर रहा है कि यह this पर एक ताला है, तो अगर ऐसा नहीं होता, यह इंतजार कर रहा है यह हो सकता है जब तक ताला लगाओ और इसे प्राप्त करें।

जब थ्रेड आपके मामले में दूसरी सिंकोननाइज्ड विधि में प्रवेश करता है, तो पहले से ही this ऑब्जेक्ट पर लॉक होता है, इसलिए यह अवरुद्ध किए बिना विधि दर्ज कर सकता है।

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