Nein. Flüchtig bedeutet, dass die Variable nicht in einem Cache pro Thread zwischengespeichert wird und ihr Wert bei Bedarf immer aus dem Hauptspeicher abgerufen wird. Synchronisation bedeutet, dass diese Caches pro Thread an bestimmten Punkten synchron gehalten werden. Theoretisch kann die Verwendung einer volatilen Variablen mit einer hohen Geschwindigkeitsstrafe verbunden sein, wenn viele Threads den Wert der Variablen lesen müssen, aber nur selten geändert werden.
Nein, das Aufrufen einer synchronized
getXXX / setXXX-Methode entspricht nicht dem Lesen / Schreiben einer volatile
-Variablen.
Mehrere Threads können gleichzeitig von einer volatile
-Variable lesen oder in sie schreiben. Aber immer nur ein Thread kann von einer Variablen lesen oder in diese schreiben, die von einem synchronized
-Block geschützt wird.
volatile
Variablen sind nicht synchronisiert (zumindest nicht in der Art wie synchronized
sachen synchronisiert ist). Was volatile
tut, ist sicherzustellen, dass eine Variable jedes Mal abgerufen wird, wenn sie verwendet wird (dh: sie verhindert bestimmte Arten der Optimierung), und IIRC, dass sie in der richtigen Reihenfolge gelesen und geschrieben wird. Dies könnte möglicherweise einige Arten von Synchronisation emulieren, aber es kann nicht dasselbe funktionieren, wenn Ihr Setter mehr als eine Sache einstellen muss. (Wenn Sie beispielsweise zwei volatile
Variablen setzen, gibt es einen Punkt, an dem der eine gesetzt ist und der andere nicht.)
Wirklich Nein.
volatile
ist eigentlich eine schwächere Form der Synchronisation, wenn das Feld als volatile
deklariert ist und der Compiler und die Laufzeit verstehen, dass diese variable
geteilt wird und Operationen darauf nicht sollten mit anderen Speicheroperationen neu angeordnet werden. Flüchtige Variablen werden nicht in Registern oder in Caches zwischengespeichert, in denen sie vor anderen Prozessoren verborgen sind. Daher gibt ein Lesevorgang einer volatile
-Variablen immer einen kürzlichen Schreibvorgang von einem beliebigen Thread zurück.
nur ein Beispiel:
%Vor%Es ist nützlich, stopped als flüchtigen boolean zu deklarieren, damit der erste Thread einen neuen Wert davon hat.
Es gibt keine Beziehung.
Grundsätzlich
Tags und Links java volatile synchronized