2015-03-08 4 views
6

सरल प्रश्न:सिंक्रनाइज़ेशन: क्लास के क्लास ऑब्जेक्ट की जगह निजी फाइनल ऑब्जेक्ट लॉक करना क्यों पसंद किया जाता है?

क्यों पसंद किया जाएगा:

public class Foo { 

    public static void doSomething() { 
     synchronized(Foo.class) { 
      //code 
     } 
    } 
} 

या इस:

public class Foo { 

    public synchronized static void doSomething() { 
     //code 
    } 
} 

public class Foo { 

    final private static Object foo = new Object(); 

    public static void doSomething() { 
     synchronized(Foo.foo) { 
      //code 
     } 
    } 
} 
इस पर

?

मेरे लिए ये सभी अनिवार्य रूप से समान दिखते हैं, इसलिए मुझे यकीन नहीं है कि स्थैतिक क्षेत्रों तक पहुंच को सिंक्रनाइज़ करने का सबसे अच्छा तरीका क्या होगा, या कोई दूसरे से बेहतर क्यों होगा, लेकिन मैंने सुना है कि पहले को प्राथमिकता दी जाती है ।

उत्तर

6

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

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