Frage von 111noname222, 29

Multithreading in Java - threads?

Hallo, ich hätte ein paar Fragen zu Multithreading in Java. Hoffentlich könnt ihr mir dabei helfen.

1) Ich hab verstanden, was ein flush (lokaler Wert wird in den globalen Speicher kopiert) und refresh (globaler Wert wird in den lokalen Speicher kopiert) ist. Ich weiß auch, dass man einen refresh und flush nach jeder Änderung der Variablen benötigt um Sequential Consistency zu garantieren. Aber ich verstehe immer noch nicht ganz, WARUM ein refresh und flush für Sequential Consistency so wichtig ist.

2) Warum ist ein Refresh ein Lesezugriff und ein Flush ein Schreibzugriff? Beim Refresh wird der globale Wert in den lokalen Speicher kopiert bzw. GESCHRIEBEN. Das müsste doch, dann ein Schreibzugriff sein? Und beim flush wird der lokale Wert in den globalen Speicher kopiert bzw. GESCHRIEBEN. Das müsste dann auch ein Schreibzugriff sein.

3) Was ist mit diesem Satz gemeint? „Refresh wird beim Lesezugriff gemacht, BEVOR der lokale Wert gelesen wird. Flush wird beim Schreibzugriff gemacht, NACHDEM der lokale Wert geschrieben wurde.“

4) Refresh bedeutet auf deutsch Aktualisierung. Was bedeutet flush auf deutsch? Nach googlen kam bündig, eben, flach raus aber ich glaube im Bezug auf Threads ist etwas anderes gemeint.

Expertenantwort
von regex9, Community-Experte für Programmierung, 11

1. Um die Daten konsistent zu halten. Wie du weißt, wird jeder Thread nicht parallel, sondern nacheinander ausgeführt, bzw. bekommt die Gelegenheit, bestimmte Operationen zu durchlaufen. Ein Thread kann dabei die Modifikationen im Speicher sehen, die von vorherigen Threads vorgenommen wurden. Würde es kein flush geben, würden die Daten nach Bearbeitung nicht im verwendeten Speicher vorliegen. Würde es keinen refresh geben, bekäme der Thread nicht die aktuellen Daten.

2. Nein. Das Hereinladen der Daten aus dem Hauptspeicher ist ein refresh, das Zurückschreiben der lokalen Daten in den Hauptspeicher ist ein flush.

3. Woher hast du diesen Satz?

Der flush aktualisiert die Daten natürlich erst, nachdem sie verändert wurden. Und der lokale Wert würde laut erstem Satz erst dann genutzt werden, nachdem die Daten aus dem Hauptspeicher kamen.

Vergleichendes Beispiel:

this.data = refresh();
this.data = 1 + 1;
flush();

Einmal angenommen, eine Methode refresh gibt eine Ganzzahl zurück (den aktuellen Wert aus dem Hauptspeicher). Danach wird der Wert vom Thread überschrieben und via flush aktualisiert.

4. Soviel wie spülen, ich denke immer an flutschen. Denke an ein Wasserrohr, welches freigespült wird, da sich noch Mineralien o.a. darin festgesetzt hat.

Keine passende Antwort gefunden?

Fragen Sie die Community