volatile Verständnisfrage

Status
Nicht offen für weitere Antworten.

jollyroger

Bekanntes Mitglied
Hi Leute,

irgendwie versteh ich diese ganze volatile-Geschichte nicht:

volatile
The volatile keyword is used on variables that may be modified simultaneously by other threads. This warns the compiler to fetch them fresh each time, rather than caching them in registers. This also inhibits certain optimisations that assume no other thread will change the values unexpectedly. Since other threads cannot see local variables, there is never any need to mark local variables volatile. You need synchronized to co-ordinate changes to variables from different threads, but often volatile will do just to look at them. volatile does not guarantee you atomic access, e.g. a++;

Was heißt denn hier nun "fetch them fresh". Soweit mein dürftiges Assembler-Wissen ausreicht, steht doch eine Variable bzw. der Inhalt entweder im RAM oder in einem Register, nicht aber in beiden synchron.

Demzufolge wäre mein Verständnis folgendermaßen:

- Thread A setzt die Variable int foo auf 5 und lässt sie im RAM. Thread B fragt diese nun ab und erhält auch 5 => unproblematisch.
- Thread A setzt die Variable int foo auf 5 und schreibt sie in irgendein Register aus Optimierungsgründen. Thread B fragt nun foo ab und kuckt erst im Register, sieht "aha, da ist foo" => unproblematisch.

Wo ist hier mein Denkfehler?

Oder können Variablen bzw. deren Inhalten wirklich gleichzeitig im RAM und in einem Register gespeichert werden?

Auch dann würde ich es nicht verstehen, weil sogar dann müsste Thread B doch immer erst in einem Register nachschauen (sonst würde so ein Cache doch keinen Sinn machen, oder) bevor er in den RAM kuckt, sprich immer mit der aktuellen Variante von foo arbeiten?

Oder ist es wirklich so:

- Variablen bzw. der Inhalte können sowohl im RAM als auch in einem Register gespeichert
- Threads kucken erst im RAM und dann in einem der Register

?

Dann würde volatile für mich Sinn machen, dann versteh ich aber nicht den Sinn von Caching via CPU-Registern....
 

DEvent

Bekanntes Mitglied
jollyroger hat gesagt.:
Was heißt denn hier nun "fetch them fresh". Soweit mein dürftiges Assembler-Wissen ausreicht, steht doch eine Variable bzw. der Inhalt entweder im RAM oder in einem Register, nicht aber in beiden synchron.
Klar kann eine Variable in Register und im RAM sein. Die Register sind ja eine art Cache fuer das schnelle Zugriffen auf haeufig benoetigte Variablen.

- Thread A setzt die Variable int foo auf 5 und lässt sie im RAM. Thread B fragt diese nun ab und erhält auch 5 => unproblematisch.
- Thread A setzt die Variable int foo auf 5 und schreibt sie in irgendein Register aus Optimierungsgründen. Thread B fragt nun foo ab und kuckt erst im Register, sieht "aha, da ist foo" => unproblematisch.

Wo ist hier mein Denkfehler?
Du hast vergessen das jeder Thread seine eigenen Register hat. Thread A holt sich die Var in seine Register. Dann kommt Thread B und holt sich die selbe Var in seine Register. Thread A aendern nun die Var in seinen Register, aber davon weis Thread B nichts.

Deswegen ist es auch keine gute Idee alles in eigenen Thread zu machen, denn jedesmal wenn man Threads switched muessen alle Register des alten Threads ins Ram kopiert, dann die alten Register des neuen Thread wiederhergestellt werden.

Sinn macht es bei mehreren CPUs, weil man da auch mehrere unabhaenige Register hat.
 

FArt

Top Contributor
Ein Wert wird immer im Heap gehalten. Temporär kann dieser Wert auch in einem Register gehalten werden und später wieder zurückgeschrieben werden.

Davon bekommt man normalerweise nichts mit. Nur wenn mehrere Threads gleichzeitig auf diesen Wert zugreifen, dann kann es ohne sychronisation passieren, dass einer einen falschen, weil alten, Wert aus dem Heap ausliest während der geänderte Wert noch im Register ist.

Synchronisiert werden kann mit volatile oder mit synchronized (oder jetzt mit den schönen Locks).

volatile verhindert auch, dass eine u.U. nicht atomare Aktion (z.B. ein long schreiben) sicher synchronisiert ist.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Collections, Locks und volatile ? Allgemeine Java-Themen 1
M Parallele Programmierung: volatile Variable nimmt ungewöhnlichen Wert an Allgemeine Java-Themen 3
P volatile bei threadsafe Klassen nötig? Allgemeine Java-Themen 3
hdi synchronized & volatile Allgemeine Java-Themen 10
E Multithreading and volatile Allgemeine Java-Themen 10
hdi volatile & Thread#sleep/yield - Versteh ich nich Allgemeine Java-Themen 14
B Volatile Frage: Reicht es nur den Singleton als volatile zu deklarieren? Allgemeine Java-Themen 4
M Verständnisfrage java.util.TimerTask Allgemeine Java-Themen 2
C try-catch Block Verständnisfrage Allgemeine Java-Themen 14
RalleYTN Collections Verständnisfrage zu Objektreferenzen in Listen Allgemeine Java-Themen 5
O log4j - Verständnisfrage Allgemeine Java-Themen 1
M Verständnisfrage bei Hausaufgabe Allgemeine Java-Themen 7
L Getter und Setter Verständnisfrage Allgemeine Java-Themen 10
H MVC - Verständnisfrage Allgemeine Java-Themen 12
E Verständnisfrage zu synchronized-Blöcken Allgemeine Java-Themen 3
E Verständnisfrage bezüglich Threads Allgemeine Java-Themen 4
agent47 Plugin System Verständnisfrage Allgemeine Java-Themen 6
T Verständnisfrage bei Nachbarschaftsbetrachtung Allgemeine Java-Themen 8
M Verständnisfrage Exceptions Allgemeine Java-Themen 2
A Generics Verständnisfrage Allgemeine Java-Themen 7
J Verständnisfrage zu Casts auf Interfaces Allgemeine Java-Themen 5
J Verständnisfrage - nested static classes Allgemeine Java-Themen 11
J Verständnisfrage zu exceptions Allgemeine Java-Themen 3
S JAAS - Verständnisfrage Allgemeine Java-Themen 2
G allgemein synchroniszed verständnisfrage Allgemeine Java-Themen 19
V FileWriter und Zahlen (Kein Problem, nur Verständnisfrage) Allgemeine Java-Themen 4
K Verständnisfrage. Allgemeine Java-Themen 9
T Eine Verständnisfrage Allgemeine Java-Themen 15
T Kleine Verständnisfrage zu Stringbuffer Allgemeine Java-Themen 2
sliwalker Verständnisfrage ObserverPattern Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben