Wednesday 15 January 2014

java - why does this code produce deadlock? -


इस सवाल का पहले से ही एक उत्तर है: < / P>

  • 1 उत्तर
      वर्ग ए { स्थिर अंतिम अंतर i; स्थिर {i = 128; थ्रेड टी = नया थ्रेड () {सार्वजनिक शून्य चला () {System.out.println ("i =" + i); }}; t.start (); कोशिश {t.join (); } पकड़ (बाधित ईक्सेप्शन ई) {Thread.currentThread ()। Interrupt (); }}} सार्वजनिक वर्ग मुख्य टेस्टिंग {सार्वजनिक स्थिर शून्य मुख्य (स्ट्रिंग [] आर्ग्स) {ए एक = नया ए (); Println ( "खत्म"); }}   

    मुझे कभी भी समाप्त नहीं मिलता है और मैं का मूल्य मिलता है I ऐसा क्यों है?

    आप थ्रेड 1 ("मुख्य" धागा) पर शुरू करते हैं, और शुरू करते हैं वर्ग के लिए स्थिर प्रारंभकर्ता निष्पादित कर रहा है।

    उस स्थिर आरंभिक के भीतर, आप फिर एक नया थ्रेड (2) शुरू करते हैं, जो A कक्षा इसका मतलब यह है कि धागा 2 को A वर्ग के शुरू होने से पहले इनिटिलाइजिंग समाप्त होने तक इंतजार करना पड़ता है, जैसा कि:

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

    हालांकि, आपका स्थिर यह पूर्ण होने से पहले A के लिए प्रारंभकर्ता प्रतीक्षा करता है जब तक थ्रेड 2 (पूरा join () पर कॉल करके) गतिचक हो जाता है: स्थिर प्रारंभकर्ता ' जब तक थ्रेड 2 पूरा नहीं हो जाता पूरा हो जाए, और थ्रेड 2 तब तक पूरा नहीं हो सकता जब तक कि स्थिर आरंभकर्ता पूरा न हो ...

    आभास: ऐसा न करें:)

No comments:

Post a Comment