2011-02-03 12 views
37

मैं जावा में इस कोड है:नेस्टेड सिंक्रनाइज़ कीवर्ड

public void doSomeThing() { 
     synchronized (this) { 
      doSomeThingElse(); 
     } 
    } 
    public void doSomeThingElse() { 
     synchronized (this) { 
      // do something else 
     } 
    } 

कर सकते हैं इस कोड को ब्लॉक? मेरा मतलब है, क्या यह कोड हमेशा के लिए इंतजार कर सकता है?

उत्तर

47

java documentation describes के लिए रैत्रांत ताला लगा के रूप में:

एक धागा एक ताला है कि यह पहले से ही

दूसरा सिंक्रनाइज़ ब्लॉक एक ही ताला उपयोग कर रहा है का मालिक है प्राप्त कर सकते हैं और इस तरह हमेशा रहेंगे उपयोग करने योग्य है क्योंकि लॉक को बाहरी विधि में पहले से ही निकाला जा चुका है।

नहीं, कोई डेडलॉक नहीं होगा।

1

पहले से ही थ्रेड निष्पादन करने वाले थ्रेड द्वारा प्राप्त लॉक कुछ विधि, इसलिए यह धागा doSomethingElse विधि निष्पादित कर सकता है।

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

+0

क्या आपका मतलब कोड [// कुछ और करें] सही ढंग से चलाया जा सकता है? –

+0

ठीक है, इसे सही ढंग से चलाना चाहिए .. यदि ऐसा नहीं है, तो आपको सभी आवश्यक कोड पोस्ट करना चाहिए। –

+0

उसका मतलब है कि धागे में पहले से ही पाउंड विधि के लिए आवश्यक लॉक है, इसलिए यह स्वयं को अवरुद्ध नहीं करेगा। – kasten

3

एक सिंक्रनाइज़ ब्लॉक में आप एक लॉक फिर से प्राप्त कर सकते हैं जो आपके पास पहले से है। लॉक प्रदाता (यह) पहले थ्रेड द्वारा doSomething() दर्ज करने के लिए अधिग्रहित किया जाएगा। फिर doSomethingElse() विधि में यह फिर से प्राप्त करेगा।

ऐसा करने का कारण? वैसे यह कहने के लिए कुछ भी नहीं है कि कुछ अन्य धागे प्रवेश करने में कुछ और नहीं है। यह किसी भी कोड को doSomething() में ब्लॉक को निष्पादित करने से रोक देगा जब तक कि थ्रेड में कुछ थ्रेड नहीं है() ने "यह" जारी किया है।

संपादित BTW यह पाठ्यक्रम ब्लॉक के ... और यह किसी भी धागा कि क्रियान्वित करने से तुल्यकालन वस्तु का स्वामित्व नहीं है अवरुद्ध कर देगा कर सकते हैं। हालांकि यह डेडलॉक (पोस्ट के रूप में) नहीं होगा।

0

दोनों मामलों में सिंक्रनाइज़ किए गए उपयोग this ताकि यदि एसओमेटिंग रन में सिंक्रनाइज़ ब्लॉक हो, तो आपके पास पहले से ही लॉक होगा ताकि आप doSomeThingElse विधि निष्पादित कर सकें।

public synchronized void doSomeThing() { 
    doSomeThingElse(); 
} 
public synchronized void doSomeThingElse() { 
    // do something else 
} 
0

आप पहले से ही पहले सिंक्रनाइज़ में मॉनिटर ताला ले लिया है:

अपने कोड बहुत आसान है, तो यह करने के लिए बराबर है। आपको हमेशा यह सुनिश्चित करना चाहिए कि समेकन डिज़ाइन प्रदर्शन प्रभाव को बड़ा न करे।

यह सुनिश्चित करने का एक तरीका केवल आवश्यक कथन/कोड सिंक्रनाइज़ करना है।

मान लें कि अब आपका कोड ऐसा कुछ दिखाई देगा।

public void doSomeThing() 
{ 
    synchronized (this) 
    {    
    synchronized (this) 
    {    
     // do something else   
    }   
    }  
} 

इस जबकि है क्या आवश्यक है

public void doSomeThing() 
    { 
     doSomeThingElse();  
    } 
public void doSomeThingElse() 
{ 
synchronized (this) 
     {    
      // do something else   
     } 
} 
7

एक धागा this पर ताला का मालिक है, यह अन्य synchronized तरीकों/मक्खन में गर्म चाकू की तरह ब्लॉक में जाना जाएगा।

+7

यह मेरी वस्तु को विभाजित करेगा? वह रूपक ... – Kissaki

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