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

Wie können wir einen Deadlock in Java vermeiden?

WBOY
Freigeben: 2023-08-20 18:13:06
nach vorne
694 Leute haben es durchsucht

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();
      }
   }
}
Nach dem Login kopieren

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.
Nach dem Login kopieren

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!

Quelle:tutorialspoint.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage