2015-06-19 9 views
6

ich habe:Ist ein einfacher Getter-Aufruf bei flüchtigen atomaren Operationen? die folgenden in meiner Klasse

private static volatile byte counter = 0; 
public static byte getCounter() {return counter;} 

Ist der Aufruf von getCounter atomar, oder nicht?

+0

Ja. Das ist der Zweck von volatilen. Neugierig zu sehen, ob mein Verständnis korrekt ist .... –

+2

Eigentlich ist der Zweck von volatile sicherzustellen, dass alle von einem Thread auf die flüchtige Variable schreiben durch nachfolgende Lesevorgänge durch andere Threads sichtbar sein wird. Das Lesen/Zuweisen eines Bytes ist atomar, mit oder ohne volatile. –

+3

Bitte beachten Sie, diese Argumentation gilt nicht für 'long' und' double' –

Antwort

10

Ja, es ist eine atomare Operation, in dem Sinne, dass es keine Neuordnung oder Zeitsteuerung geben kann, die dazu führt, dass das Byte gelesen wird, während es teilweise geschrieben wird. Wenn das Byte während des Lesens neu zugewiesen wird, gibt der Getter garantiert entweder den Vorher- oder den Nach-Wert zurück, aber kein anderer Wert, auch ohne volatile.

aber Sie Muss haben volatile auf einer Doppel-oder Long-Wert zu vermeiden inkonsistente liest bekommen, dass weder die alte noch der neue Wert:

Für die Zwecke der Programmiersprache Java-Speichermodell, Ein einzelner Schreibvorgang in einen nichtflüchtigen langen oder doppelten Wert wird als zwei separate Schreibvorgänge behandelt: einer für jede 32-Bit-Hälfte. Dies kann zu einer Situation führen, in der ein Thread die ersten 32 Bits eines 64-Bit-Wertes von einem Schreibvorgang und die zweiten 32 Bits von einem anderen Schreibvorgang sieht.

Implementierungen der Java Virtual Machine sollten möglichst keine 64-Bit-Werte aufteilen. Programmierer sind aufgefordert, gemeinsame 64-Bit-Werte als volatile zu deklarieren oder ihre Programme korrekt zu synchronisieren, um mögliche Komplikationen zu vermeiden.

Quelle: JLS8 section 17.7

+1

@RealSkeptic Richtig, ich habe das "volatile" Schlüsselwort im Post des OP nicht abgefangen. – hexafraction