Masalah jalan buntu dalam persekitaran berbilang benang boleh dicegah dengan menentukan susunan kunci tetap dan memperoleh kunci mengikut susunan. Tetapkan mekanisme tamat masa untuk berhenti menunggu apabila kunci tidak dapat diperoleh dalam masa yang ditentukan. Gunakan algoritma pengesanan kebuntuan untuk mengesan status kebuntuan benang dan ambil langkah pemulihan. Dalam kes praktikal, sistem pengurusan sumber mentakrifkan urutan kunci global untuk semua sumber dan memaksa benang memperoleh kunci yang diperlukan untuk mengelakkan kebuntuan. . kebuntuan masa. Contohnya:
public class DeadlockExample { private final Object lock1 = new Object(); private final Object lock2 = new Object(); public void method1() { synchronized (lock1) { // 获取 lock1 synchronized (lock2) { // 获取 lock2 } } } public void method2() { synchronized (lock2) { // 获取 lock2 synchronized (lock1) { // 获取 lock1 } } } }
Dalam kes ini, utas 1 akan menunggu sehingga utas 2 dilepaskan , mengakibatkan kebuntuan.
Pencegahan Kebuntuan
Untuk mengelakkan kebuntuan, anda boleh mengambil langkah berikut:
Urutan Kunci:
Tentukan susunan kunci tetap untuk semua objek dan sentiasa dapatkan kunci dalam susunan itu.lock2
,而线程 2 会等待线程 1 释放 lock1
Tetapkan tamat masa pada operasi pemerolehan kunci Jika kunci tidak dapat diperoleh dalam masa yang ditetapkan, berhenti menunggu.
Pengesanan dan Pemulihan Jalan Mati:Gunakan algoritma pengesanan jalan buntu seperti menyemak secara berkala sama ada benang berada dalam keadaan buntu dan mengambil langkah yang sesuai untuk pulih.
public class ResourceManager { private final Map<String, Object> resources = new HashMap<>(); private final Object lock = new Object(); public void allocateResource(String resource) { synchronized (lock) { resources.get(resource); } } public void releaseResource(String resource) { synchronized (lock) { resources.remove(resource); } } }Dengan mengikut perintah kunci tetap, kebuntuan pada operasi pemerolehan dan pelepasan sumber boleh dielakkan.
Atas ialah kandungan terperinci Bagaimana untuk mengelakkan kebuntuan dengan concurrency dan multi-threading dalam fungsi Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!