2013-07-22 6 views
6
public synchronized int getCountOne() { 
     return count++; 
} 

कार्यात्मक एक synchronized (this) block विधि के शरीर के चारों ओर होने के बराबर है। ऑब्जेक्ट "यह" लॉक नहीं होता है, बल्कि ऑब्जेक्ट "यह" mutex के रूप में उपयोग किया जाता है और शरीर को अन्य कोड खंडों के साथ समवर्ती रूप से निष्पादित करने से रोका जाता है, यह भी "इस" पर सिंक्रनाइज़ किया जाता है।कैसे श्रेणी स्तर ताला हासिल किया जाता है इसके बाद के संस्करण कोड पद्धति पर सिंक्रनाइज़ करने में की तरह

समान आधार जब हम अगर हम एक समारोह है में एक वर्ग के स्तर lock.As प्राप्त

public static synchronized int getCountTwo() { 
     return count++; 
} 

स्पष्ट रूप से दो धागे एक साथ getCountOne पर ताले (वस्तु स्तर लॉक) प्राप्त कर सकते हैं और क्या एक mutex के रूप में प्रयोग किया जाता है पर getCountTwo (कक्षा स्तर ताला)। तो GetCountOne

public int getCountOne() { 
    synchronized(this) { 
      return count++; 
    } 
} 

के समान है getCountTwo के बराबर है? यदि कक्षा स्तर लॉक प्राप्त करने के लिए कोई मानदंड उपयोग नहीं किया जाता है?

उत्तर

10

समान आधार पर जब हम एक वर्ग स्तर ताला

वर्ग वस्तु ही हासिल क्या एक म्युटेक्स के रूप में प्रयोग किया जाता है म्युटेक्स के रूप में इस्तेमाल किया जाएगा। अपने static synchronized विधि के लिए बराबर सिंक्रनाइज़ ब्लॉक दिखेगा की तरह:

public static int getCountTwo() { 
    synchronized(ClassName.class) { 
      return count++; 
    } 
} 

ClassName वर्ग कि विधि युक्त का नाम है।

JLS Section §8.4.3.6 देखें:

एक सिंक्रनाइज़ विधि एक मॉनिटर (§17.1) से पहले ही कार्यान्वित प्राप्त कर लेता है।

एक वर्ग (स्थिर) विधि के लिए, विधि की क्लास के लिए कक्षा वस्तु के साथ जुड़े मॉनिटर किया जाता है।

एक उदाहरण विधि के लिए, इस से जुड़े मॉनीटर (ऑब्जेक्ट जिसके लिए विधि लागू की गई थी) का उपयोग किया जाता है।

जोर मेरा।

+0

नाइस स्पष्टीकरण – Prabhaker

0

वस्तु स्तर लॉकिंग:

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

public class DemoClass 
{ 
    public synchronized void demoMethod(){} 
} 

or 

public class DemoClass 
{ 
    public void demoMethod(){ 
    synchronized (this) 
    { 
    //other thread safe code 
    } 
} 
} 

or 

public class DemoClass 
{ 
    private final Object lock = new Object(); 
    public void demoMethod(){ 
    synchronized (lock) 
{ 
    //other thread safe code 
} 
} 

कक्षा के स्तर का ताला:

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

public class DemoClass 
{ 
    public synchronized static void demoMethod(){} 
} 

or 

public class DemoClass 
{ 
    public void demoMethod(){ 
    synchronized (DemoClass.class) 
    { 
    //other thread safe code 
    } 
} 
} 

or 

public class DemoClass 
{ 
private final static Object lock = new Object(); 
public void demoMethod(){ 
synchronized (lock) 
    { 
    //other thread safe code 
    } 
} 
} 
+0

के लिए धन्यवाद प्रश्न का उत्तर नहीं देता: "म्यूटेक्स के रूप में क्या उपयोग किया जाता है"? – EJP

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

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