ホームページ  >  記事  >  Java  >  Java でのデッドロックを回避するにはどうすればよいでしょうか?

Java でのデッドロックを回避するにはどうすればよいでしょうか?

WBOY
WBOY転載
2023-08-20 18:13:06678ブラウズ

Java でのデッドロックを回避するにはどうすればよいでしょうか?

Java では、デッドロックとは、2 つ以上のスレッドが永続的にブロックされるプログラミング状況です。デッドロック状態は、少なくとも 2 つのスレッド 2 つ以上のリソース の間で発生します。

デッドロックを回避する方法

  • ネストされたロックを回避する: デッドロックは主に、ロックが複数のスレッドに提供された場合に発生します。すでに 1 つのスレッドにロックを提供している場合は、他のスレッドにロックを提供しないようにしてください。
  • 不必要なロックを避ける: 必要なメンバーにのみロックを提供する必要があります。不必要にロックを提供すると、デッドロックが発生する可能性があります。
  • Thread.join() を使用する: デッドロック状態は、あるスレッドが別のスレッドの完了を待機しているときに発生します。このような場合は、Thread.join() を使用して最大実行時間を設定できます。

public class DeadlockTest {
   public static void main(String[] args) throws InterruptedException {
      Object obj1 = new Object();
      Object obj2 = new Object();
      Object obj3 = new Object();
      Thread t1 = new Thread(new SyncThread(obj1, obj2), "t1");
      Thread t2 = new Thread(new SyncThread(obj2, obj3), "t2");
      t1.start();
      Thread.sleep(2000);
      t2.start();
      Thread.sleep(2000);
   }
}
class SyncThread implements Runnable {
   private Object obj1;
   private Object obj2;
   public SyncThread(Object o1, Object o2){
      this.obj1=o1;
      this.obj2=o2;
   }
   @Override
   public void run() {
      String name = Thread.currentThread().getName();
      System.out.println(name + " acquiring lock on " + obj1);
      <strong>synchronized (obj1)</strong> {
         System.out.println(name + " acquired lock on " + obj1);
         work();
      }
      System.out.println(name + " released lock on " + obj1);
      System.out.println(name + " acquiring lock on " + obj2);
      <strong>synchronized (obj2)</strong> {
         System.out.println(name + " acquired lock on " + obj2);
         work();
      }
      System.out.println(name + " released lock on " + obj2);
      System.out.println(name + " finished execution.");
   }
   private void work() {
      try {
         Thread.sleep(5000);
      } catch (InterruptedException ie) {
         ie.printStackTrace();
      }
   }
}

出力

t1 acquiring lock on java.lang.Object@917d8d4
t1 acquired lock on java.lang.Object@917d8d4
t2 acquiring lock on java.lang.Object@5c4b42fb
t2 acquired lock on java.lang.Object@5c4b42fb
t1 released lock on java.lang.Object@917d8d4
t1 acquiring lock on java.lang.Object@5c4b42fb
t1 acquired lock on java.lang.Object@5c4b42fb
t2 released lock on java.lang.Object@5c4b42fb
t2 acquiring lock on java.lang.Object@528cb702
t2 acquired lock on java.lang.Object@528cb702
t1 released lock on java.lang.Object@5c4b42fb
t2 released lock on java.lang.Object@528cb702
t1 finished execution.
t2 finished execution.

以上がJava でのデッドロックを回避するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はtutorialspoint.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。