2012-06-21 11 views
5

निम्नलिखित कोड में क्या होता है? सिंक्रनाइज़ेशन काम करता है? यह एक साक्षात्कार सवाल है।जावा में सिंक्रनाइज़ेशन वैरिएबल को फिर से सौंपने पर क्या होता है?

class T 
{ 
    public static void main(String args[]) 
    { 
     Object myObject = new Object(); 
     synchronized (myObject) 
     { 
      myObject = new Object(); 
     } // end sync 
    } 
} 
+4

आपका सिंक्रनाइज़ ब्लॉक मुख्य में है और लूप के भीतर नहीं है, यह केवल वैसे भी चलाया जाएगा। यहां सिंक्रनाइज़ करने में कोई बिंदु नहीं है (जब तक कि आप उस मुख्य को किसी अन्य मुख्य से कॉल न करें, जो अजीब होगा)। – assylias

उत्तर

4

हर बार जब आप सिंक्रनाइज़ ब्लॉक दर्ज करते हैं, आप एक अलग वस्तु पर सिंक्रनाइज़ करें। अधिकांश समय यह आपको भ्रमित करने के अलावा कुछ भी नहीं करेगा, लेकिन एक छोटा सा मौका है कि दो धागे एक ही वस्तु को देखेंगे और प्रतीक्षा करेंगे।

इस कारण से कोई कोड विश्लेषक आपको चेतावनी देगा यदि आप उस क्षेत्र पर सिंक्रनाइज़ कर रहे हैं जो final नहीं है।

1

यह अभी भी एक ही मॉनिटर कि अधिग्रहण कर लिया था जारी करता है, लेकिन किसी भी अन्य कोड जो भी (यहाँ असंभव के रूप में यह एक स्थानीय चर है, तुल्यकालन मौलिक व्यर्थ बनाने) myObject का उपयोग कर ताले नई वस्तु का उपयोग करने शुरू होगा।

यह मत भूलना कि सिंक्रनाइज़ेशन ऑब्जेक्ट्स (या इसके बजाय, ऑब्जेक्ट्स से जुड़े मॉनीटर) पर लागू होता है - चर नहीं। अधिग्रहण/जारी किया जा रहा मॉनीटर केवल अभिव्यक्ति के मूल्य पर निर्भर करता है जब सिंक्रनाइज़ ब्लॉक के प्रारंभ होता है। अभिव्यक्ति नहीं सिंक्रनाइज़ किए गए ब्लॉक के अंत में पुनः मूल्यांकन किया गया है।

0

नहीं, यह काम नहीं करता। जब भी कोई नया धागा आता है, तो एक नया myObject बनाया जाता है। विशेष रूप से अब myObject एक स्थानीय चर है!

यह भले ही myObject कार्य नहीं करेगा आप वस्तु आप पर ताला लगा परिवर्तन किए जा रहे हो जाएगा के बाद से एक वर्ग के सदस्य है। लंबी व्याख्या के लिए synchronization of non-final field के बारे में प्रश्न देखें।

0

मैं इस कोड के बाद से वस्तु किसी भी धागे से साझा नहीं है के पीछे का कारण नहीं दिख रहा है। सिंक्रनाइज़ किए गए ब्लॉक को हटाने से किसी भी मामले में वास्तविक परिणाम पर कोई असर नहीं पड़ेगा। यह सिर्फ अपने कोड रन कर देगा तेजी

0

आप पहली बार myObject की लॉक प्राप्त की जरूरत है, अगर यह ताला ब्लॉक किया गया था, तो आप जब तक ताला जारी की है इंतजार करना।

सिंक्रनाइज़ेशन के लिए बहु-थ्रेड वातावरण की आवश्यकता होती है। लेकिन आपका कोड समवर्ती के साथ कुछ भी नहीं लगता है। इसलिए मुझे यह बताने में खेद है कि कुछ भी नहीं होने वाला है।

0

भागो कोड और परिणाम का विश्लेषण।

public class Test { 
    static Foo o = new Foo(0); 
    static class Foo { 
     private int i = 0; 
     Foo(int i) { 
      this.i = i; 
     } 
     public void addOnce() { 
      this.i++; 
     } 
     public String toString() { 
      return String.valueOf(i); 
     } 
    } 
    public static void main(String args[]) { 
     test1(); 
     try {Thread.sleep(10000);} catch (Exception e) {} 
     test2(); 
    } 
    public static void test1() { 
     Runnable r = new Runnable() { 
      public void run() { 
       synchronized (o) { 
        System.out.println("1------>"+o); 
        o = new Foo(1); 
        try {Thread.sleep(3000);} catch (Exception e) {} 
        System.out.println("1------>"+o); 
       } 
      } 
     }; 
     new Thread(r).start(); 
     new Thread(r).start(); 
    } 
    public static void test2() { 
     Runnable r = new Runnable() { 
      public void run() { 
       synchronized (o) { 
        System.out.println("2------>"+o); 
        o.addOnce(); 
        try {Thread.sleep(3000);} catch (Exception e) {} 
        System.out.println("2------>"+o); 
       } 
      } 
     }; 
     new Thread(r).start(); 
     new Thread(r).start(); 
    } 
}