JavaRush /Blog Jawa /Random-JV /Apa Deadlock ing Jawa?
Alexey Smirnov
tingkat
Москва

Apa Deadlock ing Jawa?

Diterbitake ing grup
Tingkat kawruh sing dibutuhake kanggo mangerteni artikel: sampeyan wis ngrampungake quests Java Syntax lan Java Core, lan saiki lagi proses sinau Java Multithreading. Deadlock utawa deadlock ing Jawa utawa deadlock minangka kesalahan sing kedadeyan nalika benang duwe ketergantungan siklik ing sepasang obyek sing disinkronake. Bayangake yen siji thread mlebu ing monitor obyek x, lan liyane menyang monitor obyek y. Yen thread ing obyek xnyoba nelpon sembarang cara sing disinkronake ing obyek y, lan obyek ying wektu sing padha nyoba kanggo nelpon sembarang cara diselarasake ing obyek x, Utas bakal macet nunggu. Apa Deadlock?  - 1Ing ngisor iki conto saka tutorial java docs babagan konsep kayata deadlock. Ngendi thread blocking dumadi ing kene?
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();
    }
}
Ana rong perkara penting sing kudu dingerteni ing kene:
  1. Apa persis sing ditindakake saben benang sing mlaku bebarengan?
  2. Apa kunci sing digunakake?
Ayo miwiti saka pungkasan. Contone, sampeyan nggawe rong obyek saka kelas Friend: alphonselan gaston. Saben wong duwe kunci dhewe. Mangkono, ana loro kunci iki: gigolos lan gastons. Nalika cara sing disinkronake saka obyek dilebokake, kunci kasebut dikunci, lan nalika metode kasebut metu, dibebasake (utawa ora dikunci). Saiki babagan benang. Ayo nelpon utas pisanan Alphonse(kanthi huruf kapital kanggo mbedakake saka obyek alphonse). Mangkene apa sing ditindakake (ayo diarani A, singkatan saka Alphonse):
A: alphonse.bow(gaston) — получает лок alphonse;
A: gaston.bowBack(alphonse) — получает лок gaston;
A: возвращается из обоих методов, тем самым освобождая лок.
Lan iki apa sing ditindakake thread ing wektu iki Gaston:
G: gaston.bow(alphonse) — получает лок gaston;
G: alphonse.bowBack(gaston) — получает лок alphonse;
G: возвращается из обоих методов, тем самым освобождая лок.
Saiki ayo ngumpulake data iki lan entuk jawaban. Utas bisa intertwined (yaiku, acara kasebut bakal kedadeyan) kanthi urutan sing beda. Kebuntuan bakal bisa digunakake, umpamane, yen urutane kaya ing ngisor iki:
A: alphonse.bow(gaston) — получает лок alphonse
G: gaston.bow(alphonse) — получает лок gaston
G: пытается вызвать alphonse.bowBack(gaston), но блокируется, ожидая лока alphonse
A: пытается вызвать gaston.bowBack(alphonse), но блокируется, ожидая лока gaston
Apa Deadlock?  - 2
Ing kasus iki, loro-lorone Utas diblokir lan saben ngenteni liyane kanggo ngeculake kunci. Nanging ora ana sing bakal nindakake iki, amarga kanggo nindakake iki, dheweke kudu ngrampungake metode kasebut, lan diblokir dening benang liyane. Dadi padha macet ing ngendi kedadeyan kasebut deadlock. Nanging, tenunan liyane uga bisa, ing endi salah sawijining benang bakal duwe wektu kanggo ngrampungake sadurunge sing kapindho diwiwiti:
A: alphonse.bow(gaston) — получает лок alphonse
A: gaston.bowBack(alphonse) — получает лок gaston
A: возвращается из обоих методов, открывая оба лока
G: gaston.bow(alphonse) — получает лок gaston
G: alphonse.bowBack(gaston) — получает лок alphonse
G: возвращается из обоих методов, открывая оба лока
Ing kasus iki, ora ana pamblokiran bebarengan saka benang. Contone, sawetara cara wis ditambahake sing ngidini thread liyane duwe wektu kanggo eksekusi. Nalika asil gumantung saka urutan acara sing bebarengan (urutan sing direncanakake utawa kacepetan eksekusi), proses kasebut diarani kondisi balapan ing basa Rusia - "kondisi balapan". Ora kabeh kahanan balapan bisa nyebabake deadlock, nanging ing pengalamanku, mung kahanan balapan sing nyebabake deadlock. Dikirim dening: Dave Lillethun
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION