Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> Java

हम जावा में गतिरोध से कैसे बच सकते हैं?


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 पर जारी लॉक। 
  1. हम जावा में गोलाकार JTextField कैसे कार्यान्वित कर सकते हैं?

    A JTextField JTextComponent . का उपवर्ग है वर्ग और यह सबसे महत्वपूर्ण घटकों में से एक है जो उपयोगकर्ता को एकल-पंक्ति प्रारूप में एक इनपुट टेक्स्ट मान की अनुमति देता है . एक JTextField वर्ग एक एक्शन लिस्टनर generate उत्पन्न करेगा इंटरफ़ेस जब हम इसके अंदर कुछ इनपुट दर्ज करने का प्रयास करते हैं। JT

  1. हम जावा में एक संपादन योग्य जेएलएबल कैसे कार्यान्वित कर सकते हैं?

    जेएलएबल एक जेएलएबल वर्ग JComponent का विस्तार कर सकता है क्लास और JLabel का ऑब्जेक्ट GUI . पर टेक्स्ट निर्देश या जानकारी प्रदान करता है । एक जेएलएबल केवल पढ़ने के लिए पाठ की एक पंक्ति प्रदर्शित कर सकता है , एक छवि या दोनों पाठ और छवि । जेएलएबल के महत्वपूर्ण तरीके हैं setText(), setIcon(), setBackgr

  1. हम जावा में JToggleButton को कैसे कार्यान्वित कर सकते हैं?

    JToggleButton एक JToggleButton सार बटन . का विस्तार है और इसका उपयोग उन बटनों को दर्शाने के लिए किया जा सकता है जिन्हें चालू . पर टॉगल किया जा सकता है और बंद । जब JToggleButton पहली बार दबाया जाता है, यह दबाया रहता है और इसे दूसरी बार दबाने पर ही छोड़ा जा सकता है। एक JToggleButton एक एक्शनइवें