JavaRush /جاوا بلاگ /Random-UR /جاوا میں ڈیڈ لاک کیا ہے؟
Alexey Smirnov
سطح
Москва

جاوا میں ڈیڈ لاک کیا ہے؟

گروپ میں شائع ہوا۔
مضمون کو سمجھنے کے لیے ضروری علم کی سطح: آپ نے جاوا سنٹیکس اور جاوا کور کی تلاش مکمل کر لی ہے، اور اب جاوا ملٹی تھریڈنگ سیکھنے کے عمل میں ہیں۔ جاوا میں تعطل یا تعطل یا تعطل ایک ایسی خرابی ہے جو اس وقت ہوتی ہے جب تھریڈز کا ہم وقت ساز اشیاء کے جوڑے پر سائیکلک انحصار ہوتا ہے۔ تصور کریں کہ ایک دھاگہ آبجیکٹ مانیٹر میں جاتا ہے x، اور دوسرا آبجیکٹ مانیٹر میں جاتا ہے y۔ اگر کسی آبجیکٹ میں کوئی تھریڈ xآبجیکٹ پر کسی بھی مطابقت پذیر طریقہ کو کال کرنے کی کوشش کرتا ہے y، اور آبجیکٹ yایک ہی وقت میں آبجیکٹ پر کسی بھی مطابقت پذیر طریقہ کو کال کرنے کی کوشش کرتا ہے x، تو تھریڈ انتظار میں پھنس جائیں گے۔ ڈیڈ لاک کیا ہے؟  - 1ڈیڈ لاک جیسے تصور کے بارے میں java docs ٹیوٹوریل کی ایک مثال ذیل میں ہے۔ یہاں تھریڈ بلاکنگ کہاں ہوتی ہے؟
public class Deadlock {
    static class Friend {
        private final String name;
        public Friend(String name) {
            this.name = name;
        }
        public String getName() {
            return this.name;
        }
        public synchronized void bow(Friend bower) {
            System.out.format("%s: %s" + "  has bowed to me!%n", this.name, bower.getName());
            bower.bowBack(this);
        }
        public synchronized void bowBack(Friend bower) {
            System.out.format("%s: %s"
                + " has bowed back to me!%n",
                this.name, bower.getName());
        }
    }

    public static void main(String[] args) {
        final Friend alphonse =
            new Friend("Alphonse");
        final Friend gaston =
            new Friend("Gaston");
        new Thread(new Runnable() {
            @Override
            public void run() {
               // System.out.println("Thread 1");
                alphonse.bow(gaston);
               // System.out.println("Th: gaston bowed to alphonse");
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
              //  System.out.println("Thread 2");
                gaston.bow(alphonse);
              //  System.out.println("2.gaston waiting alph bowed");
            }
        }).start();
    }
}
یہاں سمجھنے کے لیے دو اہم چیزیں ہیں:
  1. بیک وقت چلنے والے ہر تھریڈ بالکل کیا کرتا ہے؟
  2. کون سے تالے استعمال ہوتے ہیں؟
آئیے آخر سے شروع کرتے ہیں۔ ہم کہتے ہیں کہ آپ نے کلاس کے دو آبجیکٹ بنائے ہیں Friend: alphonseاور gaston۔ ان میں سے ہر ایک کا اپنا تالا ہے۔ اس طرح، ان میں سے دو تالے ہیں: گیگولوس اور گیسٹن۔ جب کسی چیز کا مطابقت پذیر طریقہ داخل ہوتا ہے، تو اس کا تالا بند ہوجاتا ہے، اور جب طریقہ سے باہر نکلتا ہے، تو اسے جاری کیا جاتا ہے (یا غیر مقفل)۔ اب دھاگوں کے بارے میں۔ آئیے پہلے تھریڈ کو کال کریں Alphonse(اسے آبجیکٹ الفونس سے ممتاز کرنے کے لیے بڑے حرف کے ساتھ)۔ یہ کیا کرتا ہے (آئیے اسے کہتے ہیں A، مختصر کے لیے Alphonse):
A: alphonse.bow(gaston) — получает лок alphonse;
A: gaston.bowBack(alphonse) — получает лок gaston;
A: возвращается из обоих методов, тем самым освобождая лок.
اور یہ ہے کہ اس وقت تھریڈ کیا کر رہا ہے Gaston:
G: gaston.bow(alphonse) — получает лок gaston;
G: alphonse.bowBack(gaston) — получает лок alphonse;
G: возвращается из обоих методов, тем самым освобождая лок.
اب آئیے اس ڈیٹا کو ایک ساتھ رکھیں اور جواب حاصل کریں۔ دھاگوں کو مختلف ترتیبوں میں آپس میں جوڑا جا سکتا ہے (یعنی ان کے واقعات رونما ہوں گے)۔ ایک تعطل کام کرے گا، مثال کے طور پر، اگر حکم درج ذیل ہے:
A: alphonse.bow(gaston) — получает лок alphonse
G: gaston.bow(alphonse) — получает лок gaston
G: пытается вызвать alphonse.bowBack(gaston), но блокируется, ожидая лока alphonse
A: пытается вызвать gaston.bowBack(alphonse), но блокируется, ожидая лока gaston
ڈیڈ لاک کیا ہے؟  - 2
اس صورت میں، دونوں دھاگے مسدود ہیں اور ہر ایک دوسرے کے تالے کے جاری ہونے کا انتظار کر رہا ہے۔ لیکن ان میں سے کوئی بھی ایسا نہیں کرے گا، کیونکہ ایسا کرنے کے لیے انہیں اپنا طریقہ مکمل کرنا ہوگا، اور اسے کسی اور تھریڈ نے بلاک کردیا ہے۔ تو وہ پھنس گئے جہاں یہ ہوا تھا deadlock۔ تاہم، ایک اور بنائی بھی ممکن ہے، جس میں دھاگے میں سے ایک کو دوسرا شروع ہونے سے پہلے مکمل ہونے کا وقت ملے گا:
A: alphonse.bow(gaston) — получает лок alphonse
A: gaston.bowBack(alphonse) — получает лок gaston
A: возвращается из обоих методов, открывая оба лока
G: gaston.bow(alphonse) — получает лок gaston
G: alphonse.bowBack(gaston) — получает лок alphonse
G: возвращается из обоих методов, открывая оба лока
اس صورت میں، دھاگوں کی کوئی باہمی مسدودیت نہیں ہے۔ مثال کے طور پر، کچھ طریقہ شامل کیا گیا ہے جو کسی دوسرے دھاگے کو عمل میں لانے کا وقت دیتا ہے۔ جب نتیجہ بیک وقت رونما ہونے والے واقعات کی ترتیب پر منحصر ہوتا ہے (منصوبہ بند ترتیب یا عمل کی رفتار)، اس طرح کے عمل کو روسی میں ریس کی حالت کہا جاتا ہے - "ریس کنڈیشن"۔ ریس کے تمام حالات ممکنہ طور پر تعطل کا سبب نہیں بنتے، تاہم، میرے تجربے میں، صرف ریس کے حالات تعطل کا باعث بنتے ہیں۔ جواب دیا گیا: ڈیو للیتھون
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION