Heim >Java >javaLernprogramm >Wie können wir einen Deadlock in Java vermeiden?

Wie können wir einen Deadlock in Java vermeiden?

WBOY
WBOYnach vorne
2023-08-20 18:13:06695Durchsuche

Wie können wir einen Deadlock in Java vermeiden?

In Java ist Deadlock eine Programmiersituation, in der zwei oder mehr Threads dauerhaft blockiert sind. Deadlock-Bedingungen können mindestens zwischen zwei Threads und zwei oder mehr Ressourcen auftreten.

So vermeiden Sie Deadlocks

  • Verschachtelte Sperren vermeiden: Deadlocks treten hauptsächlich auf, wenn Sperren für mehrere Threads bereitgestellt werden. Wenn wir bereits eine Sperre für einen Thread bereitgestellt haben, vermeiden Sie es, Sperren für andere Threads bereitzustellen.
  • Vermeiden Sie unnötige Sperren: Wir müssen nur den notwendigen Mitgliedern Sperren bereitstellen. Das unnötige Bereitstellen von Sperren kann zu Deadlocks führen.
  • Verwenden von Thread.join(): Ein Deadlock-Zustand tritt auf, wenn ein Thread auf den Abschluss eines anderen Threads wartet. In diesem Fall können wir Thread.join() verwenden und die maximale Ausführungszeit festlegen.

Beispiel

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();
      }
   }
}

Ausgabe

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.

Das obige ist der detaillierte Inhalt vonWie können wir einen Deadlock in Java vermeiden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:tutorialspoint.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen