2013-07-16 8 views
6

एक जावा सदस्य धागा सुरक्षित होने की जरूरत है जब, हम निम्नलिखित की तरह कार्य करें:एक स्थिर सिंक्रनाइज़ फ़ंक्शन कैसे काम करता है?

public synchronized void func() { 
    ... 
} 

इस वाक्य रचना बराबर करने के लिए:

public void func() { 
     synchronized(this) { 
      .... 
     } 
} 

है, यह वास्तव में एक ताला के लिए this उपयोग करता है।

class AA { 
    private AA() {} 

    public static synchronized AA getInstance() { 
     static AA obj = new AA(); 
     return obj; 
    } 
} 

इस मामले में, क्या ताला synchronized विधि के लिए किया जाता है पर:

मेरा प्रश्न है, अगर मैं एक static विधि के साथ synchronized का उपयोग इस प्रकार है,?

+0

वर्ग ए.ए. लॉक कर दिया जाएगा 'सिंक्रनाइज़ (AA.class)', लेकिन कोई उदाहरण –

+3

स्थानीय चर 'एक सिंटैक्स त्रुटि obj' के स्थिर घोषणा नहीं है? – Thilo

उत्तर

13

स्थिर सिंक्रनाइज़ विधि के मामले में, अपने class AA अंतर्निहित लॉक हो जाएगा

इसके समकक्ष के लिए

class AA { 
    private AA() {} 

    public static AA getInstance() { 
     synchronized(AA.class) { 
      AA obj = new AA(); 
      return obj; 
     } 
    } 
} 
+3

+1। 'सिंक्रनाइज़ (एए क्लास) के बराबर {' – Thilo

+0

लेकिन 'स्थिर एए obj = नया एए();' - क्या यह संकलन समय त्रुटि नहीं देगा? – exexzian

+0

हाँ, अब यह ठीक है – exexzian

7

की class वस्तु section 8.4.3.6 of the JLS से:

एक सिंक्रनाइज़ विधि एक मॉनिटर का अधिग्रहण (§17.1) इसे निष्पादित करने से पहले।

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

तो आपका कोड मॉनिटर को AA.class के लिए प्राप्त करता है। sanbhat कहते हैं, यह

synchronized(AA.class) { 
    ... 
} 

की तरह है ... सिर्फ एक उदाहरण विधि के साथ के रूप में यह

synchronized(this) { 
    ... 
} 
0

यह AA.class ताला पर काम किया होगा।

public static AA getInstance() { 
     synchronized(AA.class){ 
      static AA obj = new AA(); 
      return obj; 
     } 

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