Sobes.tech
Junior — Middle

Wie kann man eine gegenseitige Blockierung zweier Threads in einer Multithread-Anwendung verhindern?

sobes.tech KI

Antwort von AI

Ein Deadlock tritt auf, wenn zwei oder mehr Threads unendlich auf die Freigabe von Ressourcen durch den jeweils anderen warten. Um Deadlocks zu vermeiden, können folgende Ansätze verwendet werden:

  • Vermeiden verschachtelter Sperren: Minimieren Sie die Anzahl der gleichzeitig erworbenen Ressourcen.
  • Reihenfolge beim Ressourcen-Erwerb: Ressourcen immer in derselben Reihenfolge in allen Threads erwerben.
  • Timeouts verwenden: Beim Versuch, eine Sperre zu erwerben, ein Timeout verwenden, um unendliches Warten zu vermeiden.
  • Verwendung höherstufiger Synchronisationsprimitive: z.B. aus dem Paket java.util.concurrent in Android, die die Wahrscheinlichkeit von Deadlocks verringern.

Beispiel für geordnete Ressourcenakquise:

synchronized (resourceA) {
    synchronized (resourceB) {
        // Arbeit mit den Ressourcen
    }
}

Wenn alle Threads die Reihenfolge zuerst resourceA, dann resourceB einhalten, tritt kein Deadlock auf.