Ein Livelock ist ein Fehlerzustand der Nebenläufigkeit, bei dem Prozesse oder Threads ununterbrochen aktiv sind, aber keinen Fortschritt erzielen. Anders als beim Deadlock blockieren die Beteiligten nicht — sie arbeiten, laufen aber im Kreis.

Der Unterschied zum Deadlock

Beim Deadlock warten alle Beteiligten aufeinander und keiner kann weiterarbeiten — das System steht still. Beim Livelock sind alle beschäftigt, ändern laufend ihren Zustand, und trotzdem kommt nichts dabei heraus. Ein klassisches Bild: Zwei Personen gehen in einem Gang aufeinander zu und weichen immer wieder in dieselbe Richtung aus — niemand blockiert, beide sind aktiv, doch keiner kommt voran.

Typische Ursachen

  • Miteinander konkurrierende Freigaben: Zwei Prozesse brauchen zwei Mutexe in unterschiedlicher Reihenfolge. Bekommt jeder nur seinen ersten, gibt ihn sofort wieder frei, wenn der zweite fehlt, und versucht es erneut — das kann sich endlos wiederholen. Ohne Zufall im Backoff (Wartezeit vor dem Versuch) entsteht ein Livelock.
  • Falsches Busy-Waiting: Wer in einer Schleife eine Bedingung prüft, die nie eintritt (oder ständig von anderen verändert wird), verbrennt CPU-Zeit, ohne Fortschritt zu machen — die Grenze zu einem Spinlock-Missbrauch.
  • Protokolle mit symmetrischem Verhalten: Wenn alle Teilnehmer bei einem Konflikt identisch reagieren (z. B. gleich lang warten und gleichzeitig neu starten), kollidieren sie wieder — ein bekanntes Muster aus Netzwerkprotokollen wie CSMA/CD.

Erkennen und vermeiden

Ein Livelock ist schwerer zu erkennen als ein Deadlock, weil die Systeme aktiv aussehen. Hilfreich sind Fortschrittsmetriken und Logs, die belegte Ressourcen und abgeschlossene Arbeiten zeigen. Vermeiden lässt sich Livelock durch:

  • Zufällige oder exponentiell wachsende Backoffs (Wartezeiten), damit sich Versuche nicht synchron überlappen.
  • Asymmetrische Strategien: Einer der Beteiligten gibt nach (Priorität, zufälliger Gewinner), statt symmetrisch zu konkurrieren.
  • Klare Sperrreihenfolge über alle kritischen Abschnitte — das verhindert sowohl Deadlocks als auch das Hin-und-her-Freigeben.

Eng verwandt sind die Themen Race Conditions und Semaphore: Livelocks entstehen meist dort, wo Sperren falsch eingesetzt werden — das Wissen um den Unterschied zwischen blockieren, spinnen und wiederholen ist der Schlüssel zu robusten nebenläufigen Programmen.