JavaRush /Блоги Java /Random-TG /Deadlock дар Java чист?
Alexey Smirnov
Сатҳи
Москва

Deadlock дар Java чист?

Дар гурӯҳ нашр шудааст
Сатҳи донише, ки барои фаҳмидани мақола зарур аст: шумо супоришҳои Java Syntax ва Java Core-ро анҷом додед ва ҳоло дар раванди омӯзиши Java Multithreading ҳастед. Бунбаст ё бунбаст дар Java ё бунбаст хатоест, ки вақте рух медиҳад, ки риштаҳо аз як ҷуфт an objectҳои ҳамоҳангшуда вобастагии даврӣ доранд. Тасаввур кунед, ки як ришта ба монитори an object xва дигаре ба монитори an object меравад y. Агар ришта дар an object xкӯшиш кунад, ки ягон усули ҳамоҳангшудаи an objectро даъват кунад yва an object yҳамзамон кӯшиш кунад, ки ягон усули ҳамоҳангшударо дар an object даъват кунад x, риштаҳо дар интизорӣ мемонанд. Deadlock чист?  - 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. Кадом қуфлҳо истифода мешаванд?
Биёед аз охир сар кунем. Фарз мекунем, ки шумо ду an objectи синфро офаридаед Friend: alphonseва gaston. Ҳар яке аз онҳо қулфи худро дорад. Ҳамин тариқ, ду қуфлҳо вуҷуд доранд: гиголо ва гастонҳо. Ҳангоми ворид кардани усули ҳамоҳангшудаи an object қулфи он баста мешавад ва ҳангоми баромадан аз метод он озод карда мешавад (ё кушода мешавад). Акнун дар бораи риштаҳо. Биёед риштаи аввалро даъват кунем Alphonse(бо ҳарфи калон барои фарқ кардани он аз an objectи алфонс). Ин аст он чизе ки он кор мекунад (бигзор онро 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: возвращается из обоих методов, открывая оба лока
Дар ин ҳолат, бастани мутақобилаи риштаҳо вуҷуд надорад. Масалан, баъзе усулҳо илова карда шудаанд, ки имкон медиҳад, ки риштаи дигар барои иҷро вақт дошта бошад. Вақте ки натиҷа аз тартиби рӯйдодҳои ҳамзамон рухдода вобаста аст (тартиби ба нақша гирифташуда ё суръати иҷроиш), чунин равандро ба забони русӣ шарти нажод номида мешавад - «шарти нажод». На ҳама шароитҳои мусобиқа эҳтимолан ба бунбаст оварда мерасонанд, аммо дар таҷрибаи ман, танҳо шароити мусобиқа боиси бунбаст мегардад. Муаллиф: Дэйв Лиллетун
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION