primitive Datentypen threadsicher?

obscuri

Mitglied
Hi Leute!

Mal ne kurze Frage: Ist der Zugriff auf primitive Datentypen threadsafe oder muss ich das synchronisieren?
Genauer geht es eigentlich nur um eine boolean Variable. Die steht eben in dem einen Thread in der großen while Schleife:

while(!stop){
//do stuff
}

Wenn dieser Thread aufhören soll, setzt der andere Thread dann die Variable stop auf true und der andere Thread kann die Schleife dann verlassen und wird dann beendet. Jetzt könnte es ja sein, dass genau in dem Moment der eine Thread die Variable stop schreiben will, während der andere sie lesen will. Ist das automatisch synchronisiert oder kommt es da zu Konflikten ?
synchronized kann ich auf primitive Datentypen ja nicht anwenden.

Mir ist wohl klar, dass sowas wie i++; nicht synchronisiert ist, denn wenn mans ausschreibt zu i = i + 1; sieht man ja, dass i erst gelesen werden muss, dann wird 1 addiert und dann erst wird geschreiben. Wenn i jetzt zwischen dem Lesen und dem Schreiben nach der Addition in einem anderen Thread verändert wird, wird dann quasi etwas Falsches in i geschrieben. Aber das meine ich mit meiner Frage auch nicht.

Es kann nicht sein, dass genau im gleichen Moment ein primitiver Datentyp gelesen und geschrieben wird, oder ?
 
T

tuxedo

Gast
Es kann nicht sein, dass genau im gleichen Moment ein primitiver Datentyp gelesen und geschrieben wird, oder ?

Nein, das geht nicht. Je nachdem welcher Thread intern an der Reihe ist, wird die "stop" Variable geändert oder nicht. Die while Schleife läuft dann entsprechend bis zur nächsten Abfrage der Bedingung.

Öhm, das gilt aber nicht für alle primitiven Typen. Ob's für
Code:
boolean
gilt weiß ich nicht.

Zum Thema
Code:
int
-> InformIT: Java Reference Guide > Java Atomic Operations

Und es gibt noch
Code:
AtomicBoolean
,
Code:
AtomicInteger
, ...

Ergo bin ich mit bei
Code:
boolean
nicht sicher ob das wirklich atomar ist. Hatte auf der anderen Seite damit aber noch nie Probleme (also mit
Code:
boolean
, mit
Code:
int
schon...)

- Alex
 

Lumaraf

Bekanntes Mitglied
Wenn man ein Feld ändert das nicht volatile ist hat man keine Garantie wann ein anderer Thread die Änderung sieht.
Lese- und Schreibzugriffe werden von der CPU gecached. Es kann dadurch durchaus vorkommen das nach dem setzen des booleans die Schleife trotzdem noch weiterläuft und erst irgendwann später abbricht.

Zugriffe auf volatile Felder umgehen den Cache einfach und schreiben direkt in der Arbeitsspeicher btw lesen direkt daraus. Das ist zwar etwas langsamer aber man hat wenigstens die Garantie das andere Thread die Änderungen sofort sehen können.

Mein Empfehlung wäre statt mit einem extra boolean-Feld den Thread über einen interrupt zu beenden.

Java:
while (!Thread.interrupted()) {
// ...
}
 

ice-breaker

Top Contributor
Trotzdem muss in irgendeiner Art und Weise synchronisiert werden, in diesem Falle bietet sich [c]volatile[/c] an.

genauer gesagt muss aber nicht synchronisiert werden, sondern es muss die Sichtbarkeit für einen anderen Thread gewährleistet werden.
Wird in dem Vortrag glaube ich aber auch angesprochen, der ist ein ziemlich guter Einstieg in das Thema.

Öhm, das gilt aber nicht für alle primitiven Typen. Ob's für
Code:
boolean
gilt weiß ich nicht.
bis auf long, float und double ist es gewährleistet (atomares Schreiben und lesen, aber nicht die Sichtbarkeit !)
Man sollte aber nicht vergessen, dass dies nicht für Operationen wie Inkrementieren usw. gilt, da dies mehrere Operationen sind (lesen, addieren und schreiben)
 
Zuletzt bearbeitet:

Andi_CH

Top Contributor
Vor Kurzem war hier eine Diskussion genau zu dem Thema, aber ich finde es auf die Schnelle auch nicht.
Eigentlich wurde es schon gesagt, aber ich formuliere es IMO etwas deutliher (sagen wir mal "anders" :) )

Das Problem ist weniger die Synchronisation (Da ein Thread nur schreibt und der Andere nur liest ist das sowieso nicht wirklich ein Problem) sondern die Tatsache dass z.B. auf Mulitcoremaschinen die Variable stop für den einen Thread als Kopie angelegt werden kann - das heisst es kann sie doppelt oder mehrfach geben.

Volatile zwingt die VM dazu die Variable wirklich nur einmal zu halten.
 
Zuletzt bearbeitet:

obscuri

Mitglied
Super! Danke für die Antworten!
Also ums nochmal zusammenzufassen: Zugriffe auf boolean sind atomar und damit kann es nicht sein, dass mehrere Threads genau zur gleichen Zeit auf diese Variable zugreifen. Gleiches gilt auch für alle anderen primtiven Datentypen außer long und double.
Um die Sichtbarkeit muss ich mich noch selber kümmern imdem ich z.b. die boolean-Variable mit volatile kennzeichne und dann dürfte nichts schiefgehen.

Richtig so?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Primitive Datentypen - Klassenpfad auflösen? Allgemeine Java-Themen 6
C Best Practice [Arrays] Wie sinnvoll prüfen, ob Array primitive Datentypen enthält? Allgemeine Java-Themen 6
C Primitive Datentypen in Threads Allgemeine Java-Themen 4
the[V]oid Primitive Datentypen Wrappen und als primitiv markieren? Allgemeine Java-Themen 7
D Lombock primitive Felder in RequiredArgsConstructor Allgemeine Java-Themen 2
K Arrays.asList und primitive Typen Allgemeine Java-Themen 2
A Primitive oder doch nicht? Allgemeine Java-Themen 11
the[V]oid Primitive Arrays per Reflection erzeugen? Allgemeine Java-Themen 2
F Allegemeiner Datentyp für Objekte und Primitive Variablen Allgemeine Java-Themen 6
B Mit welchen Datentypen und Strukturierung am Besten dutzende Baccaratspiele Shcritt für Schritt durchsimulieren? Allgemeine Java-Themen 26
B Abstrakte Datentypen synchronisieren Allgemeine Java-Themen 11
M Technische Realisierung von Atomic Datentypen Allgemeine Java-Themen 16
D JNA Speicherbelegung der Datentypen Allgemeine Java-Themen 13
H Mehrere Datentypen in einer Arraylist speichern Allgemeine Java-Themen 9
S Parametrisierte jUnit 5-Tests mit eigenen Datentypen/Klassen-Objekten als Test-Parameter Allgemeine Java-Themen 0
F Datentypen Kopieren von Datentypen Allgemeine Java-Themen 10
Asphorm Datentypen Datentypen werden nicht ordnungsgemäß umgewandelt Allgemeine Java-Themen 1
J Datentypen in Java Tabelle Allgemeine Java-Themen 2
B Chat auf andere Datentypen aufteilen Allgemeine Java-Themen 2
I Abstrakte Datentypen - Liste Allgemeine Java-Themen 9
M ArrayList mit verschiedenen Datentypen in String konvertieren Allgemeine Java-Themen 10
P Objekt mit verschiedenen Datentypen Allgemeine Java-Themen 5
H Datentypen Collection für SQL-Datentypen Allgemeine Java-Themen 2
M Java-Threads und Datentypen-Zugriffe Allgemeine Java-Themen 7
B Generische Datentypen MergeSort Allgemeine Java-Themen 5
B Sortieren mit generischen Datentypen Allgemeine Java-Themen 3
X Duplikate aus eigenen Datentypen entfernen Allgemeine Java-Themen 14
I Probleme mit Datentypen Allgemeine Java-Themen 4
D Addition generischer Datentypen Allgemeine Java-Themen 12
leifg Rechenoperationen auf generische Datentypen Allgemeine Java-Themen 10
M Generische Datentypen Allgemeine Java-Themen 14
E Quelltext nach Datentypen durchsuchen Allgemeine Java-Themen 10
B Eigene Datentypen Allgemeine Java-Themen 5
H Linksschieben << bei long-Datentypen Allgemeine Java-Themen 2
R Problem mit Datentypen Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben