Caching

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.

Caching
Ist sichergestellt, dass die Threads bei der Beendigung aus dem Cache in den Speicher zurück schreiben?


“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.


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?


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.


[quote=yawkat:1558713809]Es existiert eine happens-before edge zwischen Threadterminierung und einem Aufruf an join, aber das wars soweit.[/quote]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?


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.

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.


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.html


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.