Объяснение переменных volatile в документах Java

когда поток читает изменчивую переменную, он видит не только последнее изменение волатильности, но также и побочные эффекты кода, которые привели к изменению

Это упоминается в http://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html

Может ли кто-нибудь указать пример?

Вначале это показало, что поток, который читает изменчивую переменную, будет синхронизироваться с потоком записи и ждать, пока запись не будет выполнена. Но это явно не так.

Пример поможет много и будет очень признателен.

Спасибо, Мустафа

Ответ 1

Скажем, у вас есть следующий класс:

public class Shared {
    public int a;
    public int b;
    public volatile int c;
}

Теперь скажем, что поток A имеет ссылку на экземпляр этого класса и делает

shared.a = 1;
shared.b = 2;
shared.c = 3;

И пусть говорят, что поток B имеет ссылку на тот же экземпляр и делает

display(c);
display(b);
display(a);

Затем, если значение, отображаемое для c, равно 3 (т.е. если запись потока A произошла до чтения потока B), то он гарантирует модель памяти Java, что 2 и 1 также будут отображаться для b и соответственно, потому что все действия потока A, которые были сделаны до записи в volatile c, гарантированно будут отображаться потоком, который прочитал новое значение c.