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

जावा में डेडलॉक से कैसे बचें?


जावा में, एक डेडलॉक एक प्रोग्रामिंग स्थिति है जहां दो या अधिक थ्रेड्स हमेशा के लिए ब्लॉक हो जाते हैं। डेडलॉक स्थिति कम से कम दो थ्रेड्स और दो या अधिक संसाधनों के साथ होती है।

डेडलॉक से कैसे बचें

  • नेस्टेड लॉक्स से बचें: डेडलॉक मुख्य रूप से तब होता है जब हम कई थ्रेड्स को लॉक देते हैं। यदि हम पहले से ही एक को दे चुके हैं तो कई थ्रेड्स को लॉक देने से बचें।
  • अनावश्यक लॉक्स से बचें: हम केवल उन सदस्यों पर लॉक लगा सकते हैं जिनकी आवश्यकता है। अनावश्यक रूप से लॉक होने से डेडलॉक हो सकता है।
  • Thread.join() का उपयोग करना: डेडलॉक स्थिति तब दिखाई देती है जब एक थ्रेड दूसरे के खत्म होने की प्रतीक्षा कर रहा होता है। यदि यह स्थिति होती है तो हम Thread.join() का उपयोग अधिकतम समय के साथ कर सकते हैं जो निष्पादन में लगेगा।

उदाहरण

public class DeadlockTest { 
    public static void main(String[] args) throws InterruptedException { 
        Object obj1 = new Object(); 
        Object obj2 = new Object(); 
        Object obj3 = new Object(); 
        Thread t1 = new Thread(new SyncThread(obj1, obj2), "t1"); 
        Thread t2 = new Thread(new SyncThread(obj2, obj3), "t2"); 
        t1.start(); 
        Thread.sleep(2000); 
        t2.start(); 
        Thread.sleep(2000); 
    } 
} 
class SyncThread implements Runnable { 
    private Object obj1; 
    private Object obj2; 
    public SyncThread(Object o1, Object o2){ 
        this.obj1=o1; 
        this.obj2=o2; 
    } 
    @Override 
    public void run() { 
        String name = Thread.currentThread().getName(); 
        System.out.println(name + " " + obj1 + " पर लॉक प्राप्त कर रहा है"); 
        synchronized (obj1) { 
            System.out.println(name + " " + obj1 + " पर लॉक प्राप्त किया"); 
            work(); 
        } 
        System.out.println(name + " " + obj1 + " पर लॉक रिलीज़ किया"); 
        System.out.println(name + " " + obj2 + " पर लॉक प्राप्त कर रहा है"); 
        synchronized (obj2) { 
            System.out.println(name + " " + obj2 + " पर लॉक प्राप्त किया"); 
            work(); 
        } 
        System.out.println(name + " " + obj2 + " पर लॉक रिलीज़ किया"); 
        System.out.println(name + " निष्पादन समाप्त।"); 
    } 
    private void work() { 
        try { 
            Thread.sleep(5000); 
        } catch (InterruptedException ie) { 
            ie.printStackTrace(); 
        } 
    } 
}

आउटपुट

t1 java.lang.Object@917d8d4 पर लॉक प्राप्त कर रहा है t1 java.lang.Object@917d8d4 पर लॉक प्राप्त किया t2 java.lang.Object@5c4b42fb पर लॉक प्राप्त कर रहा है t2 java.lang.Object@5c4b42fb पर लॉक प्राप्त किया t1 java.lang.Object@917d8d4 पर लॉक रिलीज़ किया t1 java.lang.Object@5c4b42fb पर लॉक प्राप्त कर रहा है t1 java.lang.Object@5c4b42fb पर लॉक प्राप्त किया t2 java.lang.Object@5c4b42fb पर लॉक रिलीज़ किया t2 java.lang.Object@528cb702 पर लॉक प्राप्त कर रहा है t2 java.lang.Object@528cb702 पर लॉक प्राप्त किया t1 java.lang.Object@5c4b42fb पर लॉक रिलीज़ किया t2 java.lang.Object@528cb702 पर लॉक रिलीज़ किया t1 निष्पादन समाप्त। t2 निष्पादन समाप्त।

  1. Java में गोलाकार JTextField कैसे इम्प्लीमेंट करें? Java में गोलाकार JTextField कैसे इम्प्लीमेंट करें?

    एक JTextField, JTextComponent क्लास का एक सबक्लास है और यह सबसे महत्वपूर्ण कंपोनेंट्स में से एक है जो यूजर को सिंगल-लाइन फॉर्मेट में इनपुट टेक्स्ट मान दर्ज करने की अनुमति देता है। जब हम इसके अंदर कुछ इनपुट दर्ज करने का प्रयास करते हैं तो JTextField क्लास ActionListener इंटरफेस उत्पन्न करेगी। JTextFi

  1. Java में संपादन योग्य JLabel कैसे लागू करें? Java में संपादन योग्य JLabel कैसे लागू करें?

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

  1. Java में JToggleButton कैसे लागू करें Java में JToggleButton कैसे लागू करें

    JToggleButtonएक JToggleButton AbstractButton का एक्सटेंशन है और इसका उपयोग उन बटनों को दर्शाने के लिए किया जा सकता है जिन्हें ON और OFF किया जा सकता है।जब JToggleButton को पहली बार दबाया जाता है, तो यह दबा हुआ रहता है और इसे केवल दूसरी बार दबाने पर रिलीज़ किया जा सकता है।एक JToggleButton हर बार दबाए