解決方法: Java 同時実行エラー: スレッド デッドロック
はじめに:
同時プログラミングでは、スレッド デッドロックは非常に一般的な問題です。複数のスレッドがリソースを求めて競合している場合、スレッドが互いにリソースを解放するのを待つとデッドロックが発生する可能性があります。この記事では、スレッドデッドロックの概念、その原因、およびこの問題の解決方法を紹介します。
3.1 循環待機を回避する
循環待機は問題です。スレッド デッドロックの主な原因の 1 つ。循環待機を回避するには、スレッドが特定の順序でロックを取得し、同じ順序でロックを解放することを要求するリソース ソート アルゴリズムを使用できます。これにより、ループで待機する可能性がなくなります。
3.2 ロック順序を統一する
スレッド デッドロックの一般的な状況は、異なるスレッドが異なる順序でロックを取得し、結果として互いに待機することです。この問題を解決するには、すべてのスレッドが同じ順序でロックを取得する必要があると規定できます。これにより、ロックシーケンスのデッドロックの発生を回避できます。
3.3 ロック タイムアウト メカニズムの使用
マルチスレッド プログラミングでは、ロック タイムアウト メカニズムを使用してスレッドのデッドロックを回避できます。スレッドが一定の制限時間を超えてロックの取得を試みてロックの取得に失敗した場合、スレッドはロックの取得を諦めて他の処理方法を試すことを選択できます。
以下は、ロックのタイムアウト メカニズムを使用してスレッド デッドロックを回避するサンプル コードです。
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(); } } }
以上が修正方法: Java 同時実行エラー: スレッドのデッドロックの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。