Member since Oct 2013
278 posts
|
![]()
Subject: Klausur 24.07.2018 Aufgabe 3 Fehlersuche
Es gibt grade diskussion auf dem Pad:
Schreibtischlauf volatile boolean[] finished; 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. execute() {... finished = new boolean[4]; ... while(!finished[i]){...} ...} run() {... finished[id] = true; // (id = i der for-Schleife bei der Threaderstellung). } Oder sehe ich hier was falsch? |
Member since Sep 2018
288 posts
|
![]()
+3 smixa, BobbyB, Orlan
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.
|
I hate Forumssignaturen
|
Member since Oct 2013
278 posts
|
![]()
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. |
Member since Nov 2018
84 posts
|
![]()
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. |
Member since Nov 2015
618 posts
|
![]()
Weitere Informationen findest du via Google direkt unter "java volatile array."
|
Member since Oct 2013
278 posts
|
![]()
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. ![]() |
Member since Sep 2018
288 posts
|
![]()
Das problem ist, dass aus
while(!finished[i]){...} durch den Compiler boolean tmp = finished[i]; while(!tmp){...} werden kann. |
I hate Forumssignaturen
|
Member since Oct 2013
278 posts
|
![]()
ok, also wenn dann eben nur zwischen dem main und den workern....
ja dann eben ein AtomcBoolean... oder mit Thread-Array und Join. ![]() |
Datenschutz |
Kontakt
Powered by the Unclassified NewsBoard software, 20150713-dev,
© 2003-2011 by Yves Goergen