Java में, एक गतिरोध एक प्रोग्रामिंग स्थिति है जहां दो या दो से अधिक थ्रेड हमेशा के लिए अवरुद्ध हो जाते हैं . कम से कम दो थ्रेड . के साथ गतिरोध की स्थिति उत्पन्न होगी और दो या अधिक संसाधन ।
डेडलॉक से कैसे बचें
- नेस्टेड लॉक से बचें :गतिरोध मुख्य रूप से तब होता है जब हम कई थ्रेड्स को लॉक देते हैं। यदि हम पहले से ही एक को दे चुके हैं तो एक से अधिक धागों को ताला देने से बचें।
- अनावश्यक ताले से बचें :हम केवल उन्हीं सदस्यों को लॉक कर सकते हैं जिनकी आवश्यकता है। अनावश्यक रूप से लॉक होने से गतिरोध हो सकता है।
- Thread.join() का उपयोग करना: एक डेडलॉक स्थिति तब प्रकट होती है जब एक थ्रेड दूसरे के समाप्त होने की प्रतीक्षा कर रहा होता है। यदि यह स्थिति होती है तो हम Thread.join() . का उपयोग कर सकते हैं निष्पादन में लगने वाले अधिकतम समय के साथ।
उदाहरण
पब्लिक क्लास डेडलॉकटेस्ट {सार्वजनिक स्थैतिक शून्य मुख्य (स्ट्रिंग [] आर्ग्स) इंटरप्टेड एक्सेप्शन फेंकता है {ऑब्जेक्ट obj1 =नया ऑब्जेक्ट (); ऑब्जेक्ट obj2 =नया ऑब्जेक्ट (); वस्तु obj3 =नई वस्तु (); थ्रेड t1 =नया थ्रेड (नया सिंक थ्रेड (obj1, obj2), "t1"); थ्रेड t2 =नया थ्रेड (नया सिंक थ्रेड (obj2, obj3), "t2"); t1.स्टार्ट (); थ्रेड.स्लीप (2000); t2.स्टार्ट (); थ्रेड.स्लीप (2000); }}वर्ग सिंकथ्रेड रननेबल लागू करता है {निजी वस्तु obj1; निजी वस्तु obj2; सार्वजनिक SyncThread(ऑब्जेक्ट o1, ऑब्जेक्ट o2){ this.obj1=o1; this.obj2=o2; } @ ओवरराइड सार्वजनिक शून्य रन () {स्ट्रिंग नाम =थ्रेड। करंट थ्रेड ()। getName (); System.out.println (नाम + "अधिग्रहण लॉक ऑन" + obj1); सिंक्रनाइज़ किया गया (obj1) { System.out.println (नाम + "अधिग्रहीत लॉक ऑन" + obj1); काम(); } System.out.println (नाम + "रिलीज़ लॉक ऑन" + obj1); System.out.println (नाम + "अधिग्रहण लॉक ऑन" + obj2); सिंक्रनाइज़ किया गया (obj2) { System.out.println (नाम + "अधिग्रहीत लॉक ऑन" + obj2); काम(); } System.out.println (नाम + "रिलीज़ लॉक ऑन" + obj2); System.out.println (नाम + "निष्पादन समाप्त।"); } निजी शून्य कार्य () {कोशिश {थ्रेड.स्लीप (5000); } कैच (इंटरप्टेड एक्सेप्शन यानी) {यानी.प्रिंटस्टैकट्रेस (); } }}
आउटपुट
t1 java.lang.Object@917d8d4t1 पर लॉक प्राप्त कर रहा है java.lang पर लॉक प्राप्त कर रहा है। .Object@917d8d4t1 java.lang पर लॉक प्राप्त कर रहा है।ऑब्जेक्ट@5c4b42fbt1 java.lang पर लॉक प्राप्त कर रहा है। .Object@528cb702t1 java.lang पर जारी किया गया लॉक।ऑब्जेक्ट@5c4b42fbt2 java.lang पर जारी लॉक।