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
Ja. Das ist der Zweck von volatilen. Neugierig zu sehen, ob mein Verständnis korrekt ist .... –
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. –
Bitte beachten Sie, diese Argumentation gilt nicht für 'long' und' double' –