Deadlock ist ein häufiges Problem bei der gleichzeitigen Programmierung und kann durch Maßnahmen verhindert oder behoben werden: Deadlock verhindern: - Sperren in der richtigen Reihenfolge erwerben - zyklisches Warten vermeiden - Timeout-Mechanismus verwenden - Deadlocks mithilfe nicht blockierender Datenstrukturen behandeln: - Deadlock-Erkennung - Deadlock-Wiederherstellung – Vorgang wiederholen
Deadlock-Verhinderung und -Behandlung in der gleichzeitigen Java-Programmierung
Deadlock ist ein häufiges Problem, das bei der gleichzeitigen Programmierung auftreten kann und dazu führt, dass mehrere Threads aufeinander warten System zum Stillstand bringen. In Java können Deadlocks durch geeignete Maßnahmen verhindert oder behandelt werden.
Deadlocks verhindern
Umgang mit Deadlocks
Wenn vorbeugende Maßnahmen Deadlocks nicht verhindern können, können Sie Deadlocks folgendermaßen behandeln:
Praktischer Fall
Betrachten Sie den folgenden Java-Codeausschnitt:
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(); } }
In diesem Beispiel werden zwei Threads (Thread1 und Thread2) mit Lock1 bzw. Lock2 synchronisiert. Da beide Threads Sperren in umgekehrter Reihenfolge erwerben, warten sie darauf, dass der andere die Sperre aufhebt, was zu einem Deadlock führt.
Um einen Deadlock zu verhindern, können wir den Code ändern, um Sperren in der folgenden Reihenfolge zu erhalten:
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(); } }
Durch die Änderung des Codes stellen wir sicher, dass Thread1 und Thread2 Sperren immer in der gleichen Reihenfolge erwerben (Sperre1, dann Sperre2), und verhindern so einen Deadlock.
Das obige ist der detaillierte Inhalt vonWie kann man Deadlocks in der gleichzeitigen Java-Programmierung verhindern und damit umgehen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!