JavaRush /جاوا بلاگ /Random-SD /جاوا ۾ Deadlock ڇا آهي؟
Alexey Smirnov
سطح
Москва

جاوا ۾ Deadlock ڇا آهي؟

گروپ ۾ شايع ٿيل
مضمون کي سمجھڻ لاءِ علم جي سطح گھربل آھي: توھان جاوا سنٽيڪس ۽ جاوا ڪور جي ڳولا مڪمل ڪري چڪا آھيو، ۽ ھاڻي جاوا ملٽي ٿريڊنگ سکڻ جي عمل ۾ آھيو. جاوا ۾ Deadlock يا Deadlock يا Deadlock هڪ نقص آهي جيڪو تڏهن ٿئي ٿو جڏهن ٿريڊس کي هم وقت سازي ٿيل شين جي هڪ جوڙي تي سائيڪلڪ انحصار هجي. تصور ڪريو ته ھڪڙو ڌاڳو اعتراض مانيٽر ۾ وڃي ٿو x، ۽ ٻيو وڃي ٿو اعتراض مانيٽر ۾ y. جيڪڏهن ڪنهن شئي ۾ ٿريڊ ڪنهن xشئي تي ڪنهن به هم وقت سازي واري طريقي کي ڪال ڪرڻ جي ڪوشش ڪري ٿي y، ۽ yساڳئي وقت شئي تي ڪنهن به هم وقت سازي واري طريقي کي ڪال ڪرڻ جي ڪوشش ڪري ٿي x، ته ٿريڊ انتظار ۾ ڦاسي پوندا. Deadlock ڇا آهي؟  - 1هيٺ هڪ مثال آهي java docs tutorial مان اهڙي تصور جي باري ۾ deadlock. ٿريڊ بلاڪنگ هتي ڪٿي ٿيندي آهي؟
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
Deadlock ڇا آهي؟  - 2
انهي حالت ۾، ٻنهي موضوعن کي بلاڪ ڪيو ويو آهي ۽ هر هڪ ٻئي جي انتظار ۾ آهي ته تالا ڇڏڻ لاء. پر انهن مان ڪو به اهو نه ڪندو، ڇاڪاڻ ته اهو ڪرڻ لاء انهن کي پنهنجي طريقي کي پورو ڪرڻ جي ضرورت آهي، ۽ اهو ڪنهن ٻئي سلسلي طرفان بند ڪيو ويو آهي. تنهن ڪري اهي ڦاسي ويا جتي اهو ٿيو deadlock. تنهن هوندي، هڪ ٻيو وايو پڻ ممڪن آهي، جنهن ۾ هڪ سلسلي کي مڪمل ٿيڻ جو وقت هوندو، ٻيو شروع ٿيڻ کان اڳ:
A: alphonse.bow(gaston) — получает лок alphonse
A: gaston.bowBack(alphonse) — получает лок gaston
A: возвращается из обоих методов, открывая оба лока
G: gaston.bow(alphonse) — получает лок gaston
G: alphonse.bowBack(gaston) — получает лок alphonse
G: возвращается из обоих методов, открывая оба лока
هن معاملي ۾، اتي سلسلي جي ڪو به باهمي بلاڪ نه آهي. مثال طور، ڪجھ طريقو شامل ڪيو ويو آھي جيڪو ٻئي سلسلي کي عمل ڪرڻ لاء وقت ڏيڻ جي اجازت ڏئي ٿو. جڏهن نتيجو هڪ ئي وقت ۾ واقع ٿيندڙ واقعن جي ترتيب تي منحصر هوندو آهي (منصوبابندي ڪيل حڪم يا عمل جي رفتار)، اهڙي عمل کي روسي ۾ ريس حالت سڏيو ويندو آهي - "ريس حالت". نه سڀئي نسل جون حالتون ممڪن طور تي هڪ تعطل جو سبب بڻجن ٿيون، جڏهن ته، منهنجي تجربي ۾، صرف نسل جون حالتون تعطل جو سبب بڻجن ٿيون. پاران شايع ٿيل: Dave Lillethun
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION