Klausur 24.07.2018 Aufgabe 3 Fehlersuche

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Klausur 24.07.2018 Aufgabe 3 Fehlersuche
Es gibt grade diskussion auf dem Pad:

Schreibtischlauf

volatile boolean[] finished;
execute() {...
   finished = new boolean[4];
...
  while(!finished[i]){...}
...}
run() {...
    finished[id] = true; // (id = i der for-Schleife bei der Threaderstellung).
}

Für mich ist das keine Wettlaufsituation, die explizit geschützt werden muss. da ja jeder Thread nur an die Ihm zugewiesen Position im Array schreibt.

Oder sehe ich hier was falsch?


Wenn ich mich recht entsinne, dann besteht das Problem darin, dass die einzelnen Arrayelemente nicht volatile sind und somit die while-Schleife möglicherweise endlos läuft.

3 „Gefällt mir“

Das ist in der Grundlage korrekt, aber Endlos glaube ich jetzt irgendwie nicht, aber vielleicht eine Sekunde schneller, weil er eine

Ich habe den Code in IntelliJ getestet und ohne die while-schleife und mit einem Thread array realisiert und habe das selbe verhalten.


Exakt. Nur das Array-Objekt selbst ist volatile.

Ich glaube da fehlt noch ein Teilsatz, aber wir reden ja hier immer von THEORETISCHEN Folgen. Meistens wird es natuerlich funktionieren, aber garantiert ist es nicht.


Weitere Informationen findest du via Google direkt unter “java volatile array.”


Die RaceCondition kann doch wenn dann nur zwischen Main und WorkerThreads entstehen. Die WorkerThreads untereinander kommen sich ja nicht ins Gehege, da ja jeder Thread an eine fixe Position schreiben muss und der main Thread liest ja nur den Wert aus, also im schlimmsten Fall (jetzt der fehlende Teilsatz) rotiert der main eine Sekunde mehr in seinem Thread.Sleep(1000).
Meines Erachtens ist das aber kein Fehler in der Programmbehandlung oder dem Ergebnis, sondern maximal ein “Performance” issue. wenn das aber als Fehler angesehen wird dann ja, wäre dass der Fehler und es müsste mit einem AtomicBoolean[] gearbeitet werden. :wink:


Das problem ist, dass aus

while(!finished[i]){...}

durch den Compiler

boolean tmp = finished[i];
while(!tmp){...}

werden kann.


ok, also wenn dann eben nur zwischen dem main und den workern…
ja dann eben ein AtomcBoolean… oder mit Thread-Array und Join. :wink: