Rumah  >  Artikel  >  Java  >  Bagaimana untuk menyelesaikan pengecualian kebuntuan benang Java (ThreadDeadlockException)

Bagaimana untuk menyelesaikan pengecualian kebuntuan benang Java (ThreadDeadlockException)

WBOY
WBOYasal
2023-08-21 19:29:041176semak imbas

Bagaimana untuk menyelesaikan pengecualian kebuntuan benang Java (ThreadDeadlockException)

Cara menyelesaikan pengecualian kebuntuan benang Java (ThreadDeadlockException)

Pengenalan:
Pembuluh berbilang adalah salah satu ciri yang biasa digunakan dalam pengaturcaraan Java, tetapi dalam persekitaran berbilang benang, pengecualian kebuntuan benang mungkin berlaku, iaitu, antara benang Kedua-dua pihak sedang menunggu antara satu sama lain untuk melepaskan sumber dan tidak dapat meneruskan pelaksanaan. Artikel ini akan membincangkan punca pengecualian kebuntuan benang dan menyediakan beberapa kaedah biasa dan kod sampel untuk menyelesaikan kebuntuan benang.

1. Punca pengecualian kebuntuan benang
Kebuntuan benang biasanya disebabkan oleh sebab berikut:

  1. Syarat pengecualian bersama: Kebuntuan berlaku disebabkan benang bersaing untuk mendapatkan sumber bersama.
  2. Syarat minta dan tahan: Benang menyimpan beberapa sumber dan meminta sumber daripada urutan lain, tetapi menyimpan sumber yang telah diperolehi, menyebabkan satu sama lain menunggu.
  3. Syarat tanpa kekurangan: Sumber yang dipegang oleh benang tidak boleh dilucutkan oleh benang lain dan hanya boleh dikeluarkan sendiri.
  4. Keadaan menunggu gelung: Benang membentuk hubungan menunggu gelung untuk sumber. . Anda boleh meminimumkan bilangan blok penyegerakan atau menggunakan kunci berbutir halus untuk mengurangkan kebarangkalian pertikaian sumber antara benang.
Elak menunggu bulat:

Cuba elakkan pembentukan hubungan menunggu bulat antara benang untuk sumber. Anda boleh menggunakan susunan sumber untuk mengelakkan menunggu bulat, seperti sumber penomboran dan memerlukan benang untuk mendapatkan sumber dalam susunan berangka.

    Gunakan kunci bermasa:
  1. Kunci bermasa ialah mekanisme yang meningkatkan masa menunggu apabila meminta sumber. Jika masa menunggu terlalu lama, anda boleh melepaskan permintaan sumber semasa, melepaskan sumber yang diperoleh dan cuba mendapatkan sumber semula.
  2. Gunakan objek Kunci:
  3. Java menyediakan antara muka Kunci, yang lebih fleksibel daripada blok disegerakkan Anda boleh cuba mendapatkan kunci melalui kaedah tryLock() dan bukannya menunggu selama-lamanya. Jika pemerolehan kunci gagal, anda boleh memilih operasi lain untuk mengelakkan kebuntuan.
  4. Elakkan kunci bersarang:
  5. Jika benang memegang satu kunci semasa cuba mendapatkan kunci lain, dan benang lain memegang kunci lain semasa cuba memperoleh kunci pertama, kebuntuan akan berlaku. Oleh itu, anda harus mengelak daripada memegang satu kunci semasa cuba mendapatkan kunci lain.
  6. 3. Kod contoh pengecualian kebuntuan benang
    Berikut ialah kod contoh ringkas yang menunjukkan pengecualian kebuntuan benang dan cara menyelesaikannya.
  7. public class DeadlockExample {
        private static final Object resource1 = new Object();
        private static final Object resource2 = new Object();
    
        public static void main(String[] args) {
            Thread thread1 = new Thread(() -> {
                synchronized (resource1) {
                    System.out.println("Thread 1: Holding resource 1");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (resource2) {
                        System.out.println("Thread 1: Holding resource 1 and 2");
                    }
                }
            });
    
            Thread thread2 = new Thread(() -> {
                synchronized (resource2) {
                    System.out.println("Thread 2: Holding resource 2");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (resource1) {
                        System.out.println("Thread 2: Holding resource 2 and 1");
                    }
                }
            });
    
            thread1.start();
            thread2.start();
        }
    }
  8. Dalam kod contoh ini, dua utas memegang dua sumber masing-masing, sumber1 dan sumber2, dan cuba dapatkan sumber lain. Jika dua utas berjalan pada masa yang sama, pengecualian kebuntuan benang akan berlaku kerana setiap utas sedang menunggu satu lagi untuk mengeluarkan sumber.
  9. Untuk menyelesaikan masalah ini, kami boleh melaraskan urutan urutan mendapatkan sumber untuk memastikan benang memperoleh sumber dalam susunan yang sama. Sebagai contoh, kita boleh menukar susunan pemerolehan benang 2 untuk mendapatkan sumber1 dahulu dan kemudian sumber2. Dengan melaraskan susunan sumber diperoleh, masalah kebuntuan boleh diselesaikan.

Kesimpulan:
Pengecualian buntu benang ialah masalah biasa dalam pengaturcaraan berbilang benang, tetapi ia boleh diselesaikan dengan mengelakkan terlalu banyak blok penyegerakan, mengelakkan menunggu gelung, menggunakan kunci bermasa, menggunakan objek Kunci, dsb. Apabila menulis kod berbilang benang, anda harus memberi perhatian kepada kaedah di atas untuk mengelakkan masalah yang disebabkan oleh kebuntuan benang.

Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan pengecualian kebuntuan benang Java (ThreadDeadlockException). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn