Cara menyelesaikan: Ralat Java Concurrency: Deadlock Thread
Pengenalan:
Dalam pengaturcaraan serentak, kebuntuan benang adalah masalah yang sangat biasa. Apabila beberapa utas bersaing untuk mendapatkan sumber, kebuntuan mungkin berlaku jika utas menunggu antara satu sama lain untuk mengeluarkan sumber. Artikel ini akan memperkenalkan konsep kebuntuan benang, puncanya, dan cara menyelesaikan masalah ini.
3.1 Elakkan menunggu secara bulat
Menunggu bulat adalah salah satu punca utama kebuntuan benang. Untuk mengelakkan menunggu bulat, anda boleh menggunakan algoritma pengisihan sumber, yang memerlukan benang untuk memperoleh kunci dalam susunan tertentu dan melepaskan kunci dalam susunan yang sama. Ini menghapuskan kemungkinan menunggu dalam gelung.
3.2 Satukan susunan penguncian
Situasi biasa dalam kebuntuan benang ialah benang yang berbeza memperoleh kunci dalam susunan yang berbeza, mengakibatkan menunggu antara satu sama lain. Untuk menyelesaikan masalah ini, kita boleh menetapkan bahawa semua benang mesti memperoleh kunci dalam susunan yang sama. Ini dapat mengelakkan berlakunya kebuntuan urutan kunci.
3.3 Gunakan mekanisme tamat masa kunci
Dalam pengaturcaraan berbilang benang, mekanisme tamat masa kunci boleh digunakan untuk mengelakkan kebuntuan benang. Apabila benang cuba memperoleh kunci untuk lebih daripada had masa tertentu dan gagal memperoleh kunci, ia boleh memilih untuk berhenti mendapatkan kunci dan mencuba kaedah pemprosesan lain.
Berikut ialah kod sampel yang menggunakan mekanisme tamat masa kunci untuk mengelakkan kebuntuan benang:
public class DeadlockExample { private static Object lock1 = new Object(); private static Object lock2 = new Object(); public static void main(String[] args) { new Thread(() -> { synchronized (lock1) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (lock2) { System.out.println("Thread 1"); } } }).start(); new Thread(() -> { synchronized (lock2) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (lock1) { System.out.println("Thread 2"); } } }).start(); // 设置超时时间为2秒 CompletableFuture<Object> future = CompletableFuture.supplyAsync(() -> { while (true) { if (Thread.holdsLock(lock1) && Thread.holdsLock(lock2)) { return true; } } }).orTimeout(2000, TimeUnit.MILLISECONDS); try { future.get(); } catch (TimeoutException e) { System.out.println("Deadlock detected!"); // 执行适当的处理逻辑 } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } } }
Atas ialah kandungan terperinci Cara membetulkan: Ralat Java Concurrency: Kebuntuan benang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!