Kann mir bitte jemand anhand von Beispielen (Code) erklären, was der Unterschied ist zwischen Deadlock y Livelock ?
Antworten
Zu viele Anzeigen?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.
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.
- Bedingung des gegenseitigen Ausschlusses (jede Ressource ist 1 Prozess zugewiesen)
- Halte- und Wartezustand (Prozess hält Ressourcen und kann gleichzeitig andere Ressourcen anfordern).
- Keine Vorkaufsrechtsbedingung (zuvor gewährte Ressourcen können nicht zwangsweise entzogen werden) #Diese Bedingung hängt von der Anwendung ab
- 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.
- See previous answers
- Weitere Antworten anzeigen