394 Stimmen

Was ist der Unterschied zwischen Deadlock und Livelock?

Kann mir bitte jemand anhand von Beispielen (Code) erklären, was der Unterschied ist zwischen Deadlock y Livelock ?

2voto

stdout Punkte 2111

Stellen Sie sich vor, Sie haben Faden A und Faden B. Sie sind beide synchronised auf dasselbe Objekt und innerhalb dieses Blocks gibt es eine globale Variable, die beide aktualisieren;

static boolean commonVar = false;
Object lock = new Object;

...

void threadAMethod(){
    ...
    while(commonVar == false){
         synchornized(lock){
              ...
              commonVar = true
         }
    }
}

void threadBMethod(){
    ...
    while(commonVar == true){
         synchornized(lock){
              ...
              commonVar = false
         }
    }
}

Wenn also Thread A in die while Schleife und hält die Sperre, tut sie, was sie tun muss, und setzt die commonVar a true . Dann kommt Faden B ins Spiel, der in die while Schleife und da commonVar es true jetzt ist es in der Lage, das Schloss zu halten. Er tut dies, führt die synchronised Block, und setzt commonVar zurück zu false . Jetzt bekommt Thread A wieder sein neues CPU-Fenster, er war kurz vor der Kündigung des while Schleife, aber Faden B hat ihn gerade wieder auf false so dass sich der Zyklus von neuem wiederholt. Threads tun etwas (sie sind also nicht im traditionellen Sinne blockiert), aber für so gut wie nichts.

Es sollte vielleicht auch erwähnt werden, dass Livelock nicht unbedingt hier erscheinen muss. Ich gehe davon aus, dass der Scheduler den anderen Thread bevorzugt, sobald die synchronised die Ausführung des Blocks beenden. Die meiste Zeit über ist es eine schwer zu erfüllende Erwartung und hängt von vielen Dingen ab, die unter der Haube passieren.

1voto

RCvaram Punkte 3578

Ich wollte nur etwas Wissen weitergeben.

Deadlocks Eine Gruppe von Threads/Prozessen ist blockiert, wenn jeder Thread/Prozess in dieser Gruppe auf ein Ereignis wartet, das nur ein anderer Prozess in der Gruppe kann die .

Das bedeutet, dass ein anderer Prozess ebenfalls blockiert ist und niemand fortfahren kann.

Deadlocks treten auf, wenn Prozessen exklusiver Zugriff auf Ressourcen gewährt wird.

Diese vier Bedingungen müssen erfüllt sein, damit es zu einer Blockade kommt.

  1. Bedingung des gegenseitigen Ausschlusses (jede Ressource ist 1 Prozess zugewiesen)
  2. Halte- und Wartezustand (Prozess hält Ressourcen und kann gleichzeitig andere Ressourcen anfordern).
  3. Keine Vorkaufsrechtsbedingung (zuvor gewährte Ressourcen können nicht zwangsweise entzogen werden) #Diese Bedingung hängt von der Anwendung ab
  4. Zirkuläre Wartebedingung (Es muss sich um eine zirkuläre Kette von 2 oder mehr Prozessen handeln, von denen jeder auf eine Ressource wartet, die vom nächsten Mitglied der Kette gehalten wird) # Es wird dynamisch geschehen

Wenn wir diese Bedingungen vorfinden, können wir sagen, dass eine Situation wie eine Sackgasse entstanden ist.

LiveLock

Jeder Thread/Prozess wiederholt immer wieder denselben Zustand, kommt aber nicht weiter. Das ist vergleichbar mit einem Deadlock, da der Prozess nicht in den kritischen Abschnitt eintreten kann. In einem Deadlock warten die Prozesse jedoch, ohne etwas zu tun, während die Prozesse in einem Livelock versuchen fortzufahren, aber immer wieder in denselben Zustand zurückkehren.

(Bei einer festgefahrenen Berechnung gibt es keine mögliche Ausführungssequenz, die erfolgreich ist. Bei einer lebendig festgefahrenen Berechnung gibt es zwar erfolgreiche Berechnungen, aber eine oder mehrere Ausführungssequenzen, in denen kein Prozess in seinen kritischen Abschnitt eintritt.)

Unterschied zwischen Deadlock und Livelock

Wenn Deadlock auftritt, findet keine Ausführung statt, aber bei Livelock finden einige Ausführungen statt, die jedoch nicht ausreichen, um in den kritischen Abschnitt zu gelangen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X