ホームページ >Java >&#&チュートリアル >Java 同時プログラミングでのデッドロックを防止し、対処するにはどうすればよいですか?
デッドロックは並行プログラミングで一般的な問題であり、次の対策を講じることで防止または対処できます: デッドロックの防止: - 順番にロックを取得します - 循環待機を回避します - タイムアウト機構を使用します - デッドロックを処理するにはノンブロッキング データ構造を使用します: - デッドロックの検出-デッドロックの回復 - 操作の再試行
Java同時プログラミングにおけるデッドロックの予防と処理
デッドロックは、同時プログラミングで発生する可能性のある一般的な問題であり、複数のスレッドが互いに待機する原因になります。リソースが解放され、システムがデッドロックしてしまう。 Java では、適切な措置を講じることでデッドロックを防止または処理できます。
デッドロックを防ぐ
デッドロックの処理
予防策でデッドロックを防止できない場合は、次の方法でデッドロックを処理できます。
実際のケース
次の Java コード スニペットを考えてみましょう:
public class DeadlockExample { private final Object lock1 = new Object(); private final Object lock2 = new Object(); public void method1() { synchronized (lock1) { System.out.println("Thread " + Thread.currentThread().getName() + " acquired lock1"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (lock2) { System.out.println("Thread " + Thread.currentThread().getName() + " acquired lock2"); } } } public void method2() { synchronized (lock2) { System.out.println("Thread " + Thread.currentThread().getName() + " acquired lock2"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (lock1) { System.out.println("Thread " + Thread.currentThread().getName() + " acquired lock1"); } } } public static void main(String[] args) { DeadlockExample deadlockExample = new DeadlockExample(); Thread thread1 = new Thread(deadlockExample::method1); Thread thread2 = new Thread(deadlockExample::method2); thread1.start(); thread2.start(); } }
この例では、2 つのスレッド (thread1 と thread2) がそれぞれ lock1 と lock2 を使用して同期されます。両方のスレッドが逆の順序でロックを取得するため、お互いがロックを解放するのを待ち、その結果デッドロックが発生します。
デッドロックを防ぐために、次の順序でロックを取得するようにコードを変更できます。
public class DeadlockExample { private final Object lock1 = new Object(); private final Object lock2 = new Object(); public void method1() { synchronized (lock1) { System.out.println("Thread " + Thread.currentThread().getName() + " acquired lock1"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (lock2) { System.out.println("Thread " + Thread.currentThread().getName() + " acquired lock2"); } } } public void method2() { synchronized (lock2) { System.out.println("Thread " + Thread.currentThread().getName() + " acquired lock2"); synchronized (lock1) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Thread " + Thread.currentThread().getName() + " acquired lock1"); } } } public static void main(String[] args) { DeadlockExample deadlockExample = new DeadlockExample(); Thread thread1 = new Thread(deadlockExample::method1); Thread thread2 = new Thread(deadlockExample::method2); thread1.start(); thread2.start(); } }
コードを変更することで、スレッド 1 とスレッド 2 が常に同じ順序 (ロック 1 の次にロック 2) でロックを取得するようになり、デッドロックを防ぐことができます。
以上がJava 同時プログラミングでのデッドロックを防止し、対処するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。