Aufgabe 5.6


Mea culpa, das war schlecht ausgedrueckt ;).
Es war „richtig“ im Sinne von „dem Problem angemessen“ gemeint.

Das auf den Folien ist ne angemessene Waiter-Lösung für das Philosophen-Problem.
Beim Philosophen-Problem geht es darum, dass kein Deadlock ensteht.
Es gibt dabei auch kein Problem mit der Effizienz, da die Zeit, die ein Philosoph mit Essen und Denken verbringt,
viel Größer ist, als die Zeit die man braucht, um am synchronized wartende Threads aufzuwecken.

Es gibt aber durchaus andere Waiter-Lösungen.
Zum Beispiel kann der Waiter Deadlocks verhindern, indem er nicht zu lässt, dass alle Gabeln gleichzeitig verteilt werden.
Das kann ich mit einem AtomicInteger erreichen der schneller ist als ein synchronized.

Beim Graphfärben sieht das Ganze anders aus. Man muss zwar immer noch Deadlocks vermeiden,
aber is kommt auch auf die Effizienz der Implementierung an. Und die ist in diesem Fall extrem davon abhängig, wie wenig
Zeit die Threads im Warte-Zustand an Locks verbringen, da die eigentliche Arbeit (das Suchen und Setzen von einem passenden Int-Wert)
nur wenig Zeit kostet.

Unter dem „Waiter“-Begriff kann man viel verstehen. Generell geht es darum,
dass irgendwo eine zentrale Stelle sitzt, die den globaler Zustand kennt und zur Problemlösung nutzt.
Auf den Folien der Vorlesung ist der globale Zustand das globale Lock (synchronized),
das frei sein muss damit der Philosoph essen kann.

Ich habs nicht ausprobiert, aber ich würde um nen Kinderriegel wetten,
dass eine tryLock-Variante schneller ist. Schliesslich hast du 2 Millionen Locks und nur 2-8 Threads.
Es kommt also eher selten vor, dass sich die Threads an einem Lock treffen und einer warten muss.
Bei dir Treffen sich die Threads 2 Millionen mal an dem synchronized und bis zu 7 warten. :wink:
Eine mögliche Waiter-Variante würde also so aussehen, dass ein Thread erst mal versucht mit tryLock alle Locks zu nehmen.
Wenn es Probleme gibt, gibt er alle genommenen Locks wieder auf und ruft dann die Waiter-Methode erneut auf, um es wieder zu versuchen.
Dabei kann es eventuell zum Verhungern von einigen Threads kommen. Da kann man dann wiederum versuchen, das Verhungern zu verhindern.
Die Frage ist, ob das nicht schon wieder so viel Aufwand verursacht, dass es sich nicht lohnt. :wink: