JavaRush /Java Blog /Random-TL /Ano ang Deadlock sa Java?
Alexey Smirnov
Antas
Москва

Ano ang Deadlock sa Java?

Nai-publish sa grupo
Antas ng kaalaman na kinakailangan upang maunawaan ang artikulo: nakumpleto mo na ang Java Syntax at Java Core quests, at nasa proseso na ngayon ng pag-aaral ng Java Multithreading. Ang deadlock o deadlock sa Java o deadlock ay isang error na nangyayari kapag ang mga thread ay may paikot na dependency sa isang pares ng mga naka-synchronize na bagay. Isipin na ang isang thread ay napupunta sa object monitor x, at ang isa ay napupunta sa object monitor y. Kung ang isang thread sa isang bagay xay sumusubok na tumawag sa anumang naka-synchronize na paraan sa object y, at ang object ysa parehong oras ay sumusubok na tumawag sa anumang naka-synchronize na paraan sa object x, ang mga thread ay ma-stuck sa paghihintay. Ano ang Deadlock?  - 1Nasa ibaba ang isang halimbawa mula sa java docs tutorial tungkol sa isang konsepto tulad ng deadlock. Saan nangyayari ang pag-block ng thread dito?
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();
    }
}
Mayroong dalawang mahalagang bagay na dapat maunawaan dito:
  1. Ano nga ba ang ginagawa ng bawat isa sa mga kasabay na tumatakbong mga thread?
  2. Anong mga kandado ang ginagamit?
Magsimula tayo sa dulo. Sabihin nating lumikha ka ng dalawang bagay ng klase Friend: alphonseat gaston. Ang bawat isa sa kanila ay may sariling lock. Kaya, mayroong dalawa sa mga kandadong ito: gigolos at gastons. Kapag ang isang naka-synchronize na paraan ng isang bagay ay ipinasok, ang lock nito ay naka-lock, at kapag ang paraan ay lumabas, ito ay inilabas (o naka-unlock). Ngayon tungkol sa mga thread. Tawagan natin ang unang thread Alphonse(na may malaking titik upang makilala ito mula sa bagay na alphonse). Narito kung ano ang ginagawa nito (tawagin natin ito A, maikli para sa Alphonse):
A: alphonse.bow(gaston) — получает лок alphonse;
A: gaston.bowBack(alphonse) — получает лок gaston;
A: возвращается из обоих методов, тем самым освобождая лок.
At narito ang ginagawa ng thread sa oras na ito Gaston:
G: gaston.bow(alphonse) — получает лок gaston;
G: alphonse.bowBack(gaston) — получает лок alphonse;
G: возвращается из обоих методов, тем самым освобождая лок.
Ngayon, pagsama-samahin natin ang data na ito at makuha ang sagot. Ang mga thread ay maaaring magkakaugnay (iyon ay, ang kanilang mga kaganapan ay magaganap) sa iba't ibang pagkakasunud-sunod. Ang isang deadlock ay gagana, halimbawa, kung ang pagkakasunud-sunod ay ang mga sumusunod:
A: alphonse.bow(gaston) — получает лок alphonse
G: gaston.bow(alphonse) — получает лок gaston
G: пытается вызвать alphonse.bowBack(gaston), но блокируется, ожидая лока alphonse
A: пытается вызвать gaston.bowBack(alphonse), но блокируется, ожидая лока gaston
Ano ang Deadlock?  - 2
Sa kasong ito, ang parehong mga thread ay naharang at ang bawat isa ay naghihintay para sa isa pa na bitawan ang lock. Ngunit wala sa kanila ang gagawa nito, dahil para magawa ito kailangan nilang kumpletuhin ang kanilang pamamaraan, at ito ay hinarangan ng isa pang thread. Kaya sila ay natigil kung saan ito nangyari deadlock. Gayunpaman, posible rin ang isa pang paghabi, kung saan ang isa sa mga thread ay magkakaroon ng oras upang makumpleto bago magsimula ang pangalawa:
A: alphonse.bow(gaston) — получает лок alphonse
A: gaston.bowBack(alphonse) — получает лок gaston
A: возвращается из обоих методов, открывая оба лока
G: gaston.bow(alphonse) — получает лок gaston
G: alphonse.bowBack(gaston) — получает лок alphonse
G: возвращается из обоих методов, открывая оба лока
Sa kasong ito, walang mutual blocking ng mga thread. Halimbawa, idinagdag ang ilang paraan na nagbibigay-daan sa isa pang thread na magkaroon ng oras upang maisagawa. Kapag ang resulta ay nakasalalay sa pagkakasunud-sunod ng sabay-sabay na mga kaganapan (nakaplanong pagkakasunud-sunod o bilis ng pagpapatupad), ang naturang proseso ay tinatawag na kondisyon ng lahi sa Russian - "kondisyon ng lahi". Hindi lahat ng kundisyon ng lahi ay maaaring maging sanhi ng deadlock, gayunpaman, sa aking karanasan, ang mga kundisyon ng lahi lamang ang nagdudulot ng mga deadlock. Sinagot ni: Dave Lillethun
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION