2010-03-18 11 views
5

निम्न वर्ग परिभाषा मानते हैं:जावा क्लास थ्रेड द्वारा शुरू किया गया है जो इसे पहली बार उपयोग करता है?

public class A { 
    public final static String SOME_VALUE; 

    static { 
     SOME_VALUE = "some.value"; 
    } 
} 

public class B { 
    private final String value = A.SOME_VALUE; 
} 

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

उत्तर

4

कक्षाओं को लोड करने के लिए कोई विशेष धागा नहीं है। यह धागे से होगा जो पहली बार कक्षा को संदर्भित करता है। ClassLoader.loadClass विधि सिंक्रनाइज़ की गई है ताकि एक ही कक्षा को लोड करने का प्रयास करने वाले एकाधिक थ्रेड हस्तक्षेप न करें।

संपादित कोड की गणना करने में

public class Arbit { 
    public static void main(String[] args) throws Exception{ 
     B b1 = new B("1"); 
     B b2 = new B("2"); 
     B b3 = new B("3"); 
     b1.start(); 
     b2.start(); 
     b3.start(); 
     b1.join(); 
     b2.join(); 
     b3.join(); 
    } 
} 

class B extends Thread{ 
    B(String s){ 
     setName(s); 
    } 
    @Override 
    public void run() { 

     try { 
      Thread.sleep(new Random().nextInt(100)); 
     } catch (InterruptedException e) { 
     } 
     System.out.println(A.s); 
    } 
} 

class A{ 
    static String s = Thread.currentThread().getName(); 
} 
+0

मुझे जेडीके 7 से विश्वास है कि आपके पास एक ही कक्षा लोडर से एक ही समय में दो कक्षाएं हो सकती हैं। –

+0

@ टॉम लेकिन इससे समस्याएं उत्पन्न नहीं होंगी उदा। यदि एक बराबर विधि में मैंने इसे रखा है .getClass() == obj.getClass() – saugata

+0

प्रत्येक व्यक्तिगत वर्ग को एक बार आरंभ किया जाएगा, लेकिन एक ही कक्षा लोडर में कई अलग-अलग कक्षाएं हो सकती हैं जिन्हें एक ही समय में शुरू किया जाता है। यह वर्तमान में आपके उत्तर में नोट किए गए लॉक के कारण नहीं हो सकता है। (मुझे लगता है कि यह सही है।) –

5

वर्गों 12.4.1 ("जब प्रारंभ होता है") और 12.4.2 ("विस्तृत प्रारंभ प्रक्रिया") JLS के पर एक नज़र डालें:

कक्षा या इंटरफेस को शुरू करने की प्रक्रिया निम्नानुसार है:

  1. क्लास ऑब्जेक्ट पर सिंक्रनाइज़ (§14.19) जो कक्षा या इंटरफ़ेस को प्रारंभ करने के लिए दर्शाता है। इसमें तब तक प्रतीक्षा शामिल है जब तक कि वर्तमान थ्रेड उस ऑब्जेक्ट के लिए लॉक प्राप्त नहीं कर सकता (§17.1)।
  2. यदि किसी अन्य थ्रेड द्वारा क्लास या इंटरफ़ेस के लिए प्रारंभिक प्रगति हो रही है, तो इस क्लास ऑब्जेक्ट पर प्रतीक्षा करें (जो अस्थायी रूप से लॉक जारी करता है)। जब वर्तमान धागा प्रतीक्षा से जागता है, तो इस चरण को दोहराएं।
  3. यदि वर्तमान धागे द्वारा कक्षा या इंटरफेस के लिए प्रारंभिक प्रगति पर है, तो यह प्रारंभिकरण के लिए एक पुनरावर्ती अनुरोध होना चाहिए। क्लास ऑब्जेक्ट पर लॉक जारी करें और सामान्य रूप से पूर्ण करें।
  4. यदि कक्षा या इंटरफ़ेस पहले ही प्रारंभ हो चुका है, तो आगे कोई कार्रवाई की आवश्यकता नहीं है। क्लास ऑब्जेक्ट पर लॉक जारी करें और सामान्य रूप से पूर्ण करें।
    ...

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

+0

+1 – medopal

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

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