Not logged in. · Lost password · Register

elias007
Avatar
Member since Oct 2017
90 posts
Subject: Caching
Ist sichergestellt, dass die Threads bei der Beendigung aus dem Cache in den Speicher zurück schreiben?
yawkat
faui2k15.de
Avatar
Member since Sep 2015
142 posts
"Caching" ist kein Konzept des Java memory models und ist vollkommen unzureichend um das JMM zu verstehen.

Es existiert eine happens-before edge zwischen Threadterminierung und einem Aufruf an join, aber das wars soweit.
elias007
Avatar
Member since Oct 2017
90 posts
Meinst du, dass bei einem join bzw. await termination (executor) immer in den Speicher zurückgeschrieben wird, ansonsten aber es durchaus im Cache verbleiben kann?
yawkat
faui2k15.de
Avatar
Member since Sep 2015
142 posts
Nochmal: Java hat keinen Cache. Jede Beschreibung die auf "Caching" basiert ist nicht ausreichend.

Und nein, ein join/awaitTermination muss nicht unbedingt in den "Speicher zurückschreiben". Es gibt nur eine HB edge zum Thread der diese Methode aufruft - nicht das Gleiche. Das ist alles, nix mit Cache.
Inf2017
Member since Nov 2017
212 posts
In reply to post #2
Quote by yawkat on 2019-05-24, 18:03:
Es existiert eine happens-before edge zwischen Threadterminierung und einem Aufruf an join, aber das wars soweit.
Was ist eine happens-before edge? Auf den Vorlesungsfolien steht leider nur ein Satz zu dem Speichermodell. "Die Regeln von Java sind recht komplex, weil sie die Tatsache, dass Aktivitätsfäden lokale Daten speichern können, für den Programmierer sichtbar macht." Ist sichergestellt, dass eine primitive nicht volatile Variable nach einem join bzw. einem awaitTermination im Haupthread den zuletzt geschriebenen Wert annimmt?
yawkat
faui2k15.de
Avatar
Member since Sep 2015
142 posts
Quote by Inf2017:
Quote by yawkat on 2019-05-24, 18:03:
Es existiert eine happens-before edge zwischen Threadterminierung und einem Aufruf an join, aber das wars soweit.
Was ist eine happens-before edge? Auf den Vorlesungsfolien steht leider nur ein Satz zu dem Speichermodell. "Die Regeln von Java sind recht komplex, weil sie die Tatsache, dass Aktivitätsfäden lokale Daten speichern können, für den Programmierer sichtbar macht."

In PFP wird das Memorymodell von Java leider nur oberflächlich besprochen. In diesem Foliensatz wird das "Garantierte Sichtbarkeit" genannt, aber nicht weiter beschrieben. Dadurch dass das Speichermodell nur wenig besprochen wird kann man wenn man nur PFP hört grundsätzlich erstmal nicht Aussagen wie in diesem Thread treffen - das einzige was man weiß ist dass solange eine Variable volatile ist, oder sie an allen Zugriffstellen immer mit einem Lock/synchronized geschützt ist, diese nicht "seltsames Verhalten" aufweist. Wenn man versucht mit nicht-volatile zu Arbeiten muss man sich mehr in das Memorymodell einlesen.

Quote by Inf2017:
Ist sichergestellt, dass eine primitive nicht volatile Variable nach einem join bzw. einem awaitTermination im Haupthread den zuletzt geschriebenen Wert annimmt?

Ja, solange die Schreibaktion ausschließlich in dem Thread stattfindet auf den via awaitTermination bzw join gewartet wurde. Aber Achtung: In anderen Threads die nicht mit join/awaitTermination gewartet haben darf weiterhin ein alter Wert sichtbar sein.
Inf2017
Member since Nov 2017
212 posts
Woher weißt du, dass bei awaitTermination eine happens-before-Beziehung besteht? Gehst du davon aus, dass der ExecutorService intern einen join nutzt?

https://docs.oracle.com/javase/specs/jls/se8/html/jls-17.h…
yawkat
faui2k15.de
Avatar
Member since Sep 2015
142 posts
Quote by Inf2017:
Woher weißt du, dass bei awaitTermination eine happens-before-Beziehung besteht? Gehst du davon aus, dass der ExecutorService intern einen join nutzt?

https://docs.oracle.com/javase/specs/jls/se8/html/jls-17.h…

Nein, es nutzt intern kein join. Dass es eine happens-before-edge gibt ist leider nicht sinnvoll dokumentiert. Man kann das aus "until all tasks have completed execution" rauslesen, aber das ist schon ein bisschen weiter hergegriffen.

In normalen Anwendungsfällen nutzt man aber awaitTermination eh nicht um auf Taskende zu warten, sondern future.get.
Close Smaller – Larger + Reply to this post:
Verification code: VeriCode Please enter the word from the image into the text field below. (Type the letters only, lower case is okay.)
Smileys: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Special characters:
Go to forum
Datenschutz | Kontakt
Powered by the Unclassified NewsBoard software, 20150713-dev, © 2003-2011 by Yves Goergen