Rumah  >  Artikel  >  Java  >  Bagaimana untuk menangani masalah kebuntuan Java

Bagaimana untuk menangani masalah kebuntuan Java

PHPz
PHPzke hadapan
2023-06-03 18:29:421336semak imbas

1. Pengenalan kepada kebuntuan

Kebuntuan merujuk kepada fenomena bahawa dalam program Java, beberapa utas menunggu antara satu sama lain disebabkan persaingan untuk mendapatkan sumber, mengakibatkan ketidakupayaan untuk meneruskan proses. Berlakunya kebuntuan menghalang utas yang terlibat daripada terus dilaksanakan, menyebabkan keseluruhan program terhenti.

2. Syarat untuk kebuntuan Java boleh diringkaskan sebagai empat berikut:

  • Syarat Pengecualian Bersama (Pengecualian Bersama): sumber berada dalam Masa yang sama hanya boleh diduduki oleh satu utas. Apabila utas telah menduduki sumber, utas lain tidak boleh mengakses sumber itu sehingga sumber itu dikeluarkan oleh utas yang menduduki.

  • Tahan dan Tunggu (Tahan dan Tunggu): Walaupun urutan mengandungi sekurang-kurangnya satu sumber, ia juga cuba meminta sumber yang diduduki oleh urutan lain. Ini akan menyebabkan benang masih memegang sumber yang sudah dimilikinya sementara menunggu sumber lain.

  • Syarat bukan preemption (Tiada Preemption): Sumber yang diduduki oleh thread tidak boleh didahulukan oleh thread lain. Hanya apabila utas secara aktif mengeluarkan sumber boleh utas lain memperoleh sumber itu.

  • Tunggu Pekeliling (Tunggu Pekeliling): Terdapat sekumpulan benang T1, T2,..., Tn, antaranya T1 menunggu sumber yang diduduki oleh T2, dan T2 menunggu T3 Sumber yang diduduki,...,Tn menunggu sumber yang diduduki oleh T1, membentuk hubungan menunggu kitaran.

3. Punca kebuntuan

  • Persaingan sumber antara benang: Apabila berbilang rangkaian mengakses sumber yang dikongsi pada masa yang sama, persaingan sumber mungkin berlaku , mengakibatkan kebuntuan.

  • Menunggu bulat: Terdapat hubungan menunggu kitaran antara urutan untuk sumber, menyebabkan setiap utas menunggu untuk urutan lain mengeluarkan sumber.

  • Tertib tidak konsisten: Apabila utas meminta sumber, jika mereka tidak meminta sumber dalam susunan tetap, ia mudah menyebabkan kebuntuan.

4 Strategi untuk mengelakkan kebuntuan

  • Minta sumber dalam susunan tetap: Pastikan semua urutan meminta sumber dalam susunan yang sama kemungkinan kebuntuan.

  • Elakkan menunggu bulat: Pastikan tiada hubungan menunggu bulat antara urutan untuk sumber.

  • Gunakan tetapan tamat masa kunci: Anda boleh menggunakan kaedah tryLock() dalam Java untuk menetapkan tamat masa kunci supaya kunci boleh dilepaskan secara automatik selepas tamat masa dan mengurangkan berlakunya kebuntuan.

5. Contoh Kod

Berikut ialah contoh jalan buntu Java:

public class DeadlockDemo {
    private static Object lock1 = new Object();
    private static Object lock2 = new Object();

    public static void main(String[] args) {
        new Thread(() -> {
            synchronized (lock1) {
                System.out.println("Thread 1: Holding lock 1");
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("Thread 1: Waiting for lock 2");
                synchronized (lock2) {
                    System.out.println("Thread 1: Holding lock 1 & 2");
                }
            }
        }).start();

        new Thread(() -> {
            synchronized (lock2) {
                System.out.println("Thread 2: Holding lock 2");
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("Thread 2: Waiting for lock 1");
                synchronized (lock1) {
                    System.out.println("Thread 2: Holding lock 1 & 2");
                }
            }
        }).start();
    }
}

Dalam contoh di atas, utas 1 dan utas 2 masing-masing dikunci lock1 dan lock2. Walau bagaimanapun, apabila cuba mendapatkan sumber yang dikunci oleh pihak yang satu lagi, kebuntuan berlaku kerana kedua-dua pihak sedang menunggu pihak yang satu lagi melepaskan sumber tersebut.

6. Mendiagnosis kebuntuan

Java menyediakan beberapa alat dan kaedah untuk mengesan dan menganalisis masalah kebuntuan.

  • Gunakan alat jstack: jstack ialah alat baris arahan untuk Java yang boleh digunakan untuk menganalisis maklumat tindanan benang. Apabila kebuntuan berlaku dalam atur cara, anda boleh menggunakan jstack untuk melihat status utas untuk menentukan utas yang telah buntu.

  • Menggunakan ThreadMXBean: ThreadMXBean ialah sebahagian daripada Java Management Extensions (JMX) dan boleh digunakan untuk mengesan kebuntuan. Berikut ialah contoh mudah:

import java.lang.management.ManagementFactory;
import java.lang.management.ThreadInfo;
import java.lang.management.ThreadMXBean;

public class DeadlockDetector {
    public static void main(String[] args) {
        ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
        long[] deadlockedThreads = threadMXBean.findDeadlockedThreads();

        if (deadlockedThreads != null) {
            ThreadInfo[] threadInfos = threadMXBean.getThreadInfo(deadlockedThreads);
            for (ThreadInfo threadInfo : threadInfos) {
                System.out.println("Deadlocked thread: " + threadInfo.getThreadId() + " - " + threadInfo.getThreadName());
            }
        } else {
            System.out.println("No deadlocked threads found.");
        }
    }
}

Atas ialah kandungan terperinci Bagaimana untuk menangani masalah kebuntuan Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam