Volatile vs. Schleife

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.

Volatile vs. Schleife
Hi folgendes Codebeispiel mit Frage

volatile int zaehler = 0;

jetzt erstelle ich 2 Threads deren run methode gleich ist und wie folgt aussieht:
for (int i = 0; i < 10; i++) {
zaehler++;
}

Warum kommt trotzdem nicht immer 20 raus?


weil volatile nix synchronisiert, dafür brauchts du atomic integer


ok anscheinend kann hier immernoch ein thread das ergebnis des anderen überschreiben.

wieder was gelernt :smiley:


volatile stellt nur die Sichtbarkeit sicher, also dass der andere Thread überhaupt die geänderten Werte sieht (Sichtbarkeitsynchronisation).

Trotzdem können beide Threads den selben Wert lesen und dann der Reihe nach ihr Ergebnis schreiben (siehe auch Vorlesungsfolien). Zur Lösung brauchst du entweder synchronized (langsam!) oder, wie Danieru schon sagte, AtomicInteger.


volatile möchtest du für Zuweisungen verwenden. Für Rechenoperationen wie oben geschrieben atomic integer. Volatile lässt den Prozessor das Ergebnis gleich wieder in den Speicher schreiben, nachdem die Operation ausgeführt wurde. Wenn jetzt aber der zweite Thread sich genau dann den Wert aus dem Speicher holt, wenn der erste Thread ihn schon hat, aber noch nicht zurückgeschrieben, geht’s kaputt.

EDIT: Zu langsam. :confused: