ist eine volatile Variable synchronisiert? (Java)

8

Angenommen, ich habe eine private Variable und ich habe eine Methode setVariable() , die synchronized ist, ist das nicht genau dasselbe wie die Verwendung von volatile modifier?

    
yotamoo 22.05.2011, 16:02
quelle

6 Antworten

7

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.

    
Ernest Friedman-Hill 22.05.2011, 16:08
quelle
4

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.

    
Nam San 27.10.2012 07:19
quelle
1

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.)

    
cHao 22.05.2011 16:16
quelle
0

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.

    
Premraj 22.05.2011 16:16
quelle
0

nur ein Beispiel:

%Vor%

Es ist nützlich, stopped als flüchtigen boolean zu deklarieren, damit der erste Thread einen neuen Wert davon hat.

    
EricParis16 22.05.2011 17:16
quelle
0

Es gibt keine Beziehung.

Grundsätzlich

  • Volatile = & gt; es ruft immer den letzten Wert des Parameters ab
  • Synchronisiert = & gt; es dient nur 1 Thread gleichzeitig
Mustafa Güven 03.06.2014 13:00
quelle

Tags und Links