JavaRush /Java Blog /Random-ID /Apa itu Kebuntuan di Jawa?
Alexey Smirnov
Level 29
Москва

Apa itu Kebuntuan di Jawa?

Dipublikasikan di grup Random-ID
Tingkat pengetahuan yang diperlukan untuk memahami artikel: Anda telah menyelesaikan misi Sintaks Java dan Inti Java, dan sekarang sedang dalam proses mempelajari Java Multithreading. Deadlock atau kebuntuan di Java atau deadlock adalah kesalahan yang terjadi ketika thread memiliki ketergantungan siklik pada sepasang objek yang disinkronkan. Bayangkan satu thread masuk ke objek monitor x, dan yang lainnya masuk ke objek monitor y. Jika thread dalam suatu objek xmencoba memanggil metode apa pun yang disinkronkan pada objek tersebut y, dan objek tersebut ypada saat yang sama mencoba memanggil metode apa pun yang disinkronkan pada objek tersebut x, maka thread tersebut akan terhenti saat menunggu. Apa itu Kebuntuan?  - 1Di bawah ini adalah contoh dari tutorial java docs tentang konsep kebuntuan. Di mana pemblokiran thread terjadi di sini?
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();
    }
}
Ada dua hal penting yang perlu dipahami di sini:
  1. Apa sebenarnya yang dilakukan masing-masing thread yang berjalan secara bersamaan?
  2. Kunci apa yang digunakan?
Mari kita mulai dari akhir. Katakanlah Anda membuat dua objek kelas Friend: alphonsedan gaston. Masing-masing memiliki kuncinya sendiri. Jadi, ada dua kunci ini: gigolo dan gaston. Ketika metode yang disinkronkan dari suatu objek dimasukkan, kuncinya dikunci, dan ketika metode tersebut keluar, metode tersebut dilepaskan (atau dibuka kuncinya). Sekarang tentang utasnya. Sebut saja thread pertama Alphonse(dengan huruf kapital untuk membedakannya dengan objek alphonse). Berikut fungsinya (sebut saja A, kependekan dari Alphonse):
A: alphonse.bow(gaston) — получает лок alphonse;
A: gaston.bowBack(alphonse) — получает лок gaston;
A: возвращается из обоих методов, тем самым освобождая лок.
Dan inilah yang dilakukan thread saat ini Gaston:
G: gaston.bow(alphonse) — получает лок gaston;
G: alphonse.bowBack(gaston) — получает лок alphonse;
G: возвращается из обоих методов, тем самым освобождая лок.
Sekarang mari kita gabungkan data ini dan dapatkan jawabannya. Utas dapat terjalin (yaitu, peristiwa-peristiwanya akan terjadi) dalam urutan yang berbeda. Deadlock akan berhasil, misalnya jika urutannya sebagai berikut:
A: alphonse.bow(gaston) — получает лок alphonse
G: gaston.bow(alphonse) — получает лок gaston
G: пытается вызвать alphonse.bowBack(gaston), но блокируется, ожидая лока alphonse
A: пытается вызвать gaston.bowBack(alphonse), но блокируется, ожидая лока gaston
Apa itu Kebuntuan?  - 2
Dalam hal ini, kedua thread diblokir dan masing-masing menunggu thread lain melepaskan kuncinya. Tapi tak satupun dari mereka akan melakukan hal ini, karena untuk melakukan hal ini mereka perlu menyelesaikan metode mereka, dan itu diblokir oleh thread lain. Jadi mereka terjebak di tempat kejadiannya deadlock. Namun, penenunan lain juga dimungkinkan, di mana salah satu utas memiliki waktu untuk diselesaikan sebelum utas kedua dimulai:
A: alphonse.bow(gaston) — получает лок alphonse
A: gaston.bowBack(alphonse) — получает лок gaston
A: возвращается из обоих методов, открывая оба лока
G: gaston.bow(alphonse) — получает лок gaston
G: alphonse.bowBack(gaston) — получает лок alphonse
G: возвращается из обоих методов, открывая оба лока
Dalam hal ini, tidak ada saling memblokir benang. Misalnya, beberapa metode telah ditambahkan yang memungkinkan thread lain memiliki waktu untuk mengeksekusi. Ketika hasilnya bergantung pada urutan peristiwa yang terjadi secara bersamaan (urutan yang direncanakan atau kecepatan pelaksanaan), proses seperti itu disebut kondisi balapan dalam bahasa Rusia - “kondisi balapan”. Tidak semua kondisi balapan berpotensi menimbulkan deadlock, namun menurut pengalaman saya, hanya kondisi balapan yang menyebabkan deadlock. Dikirim oleh: Dave Lillethun
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION