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

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

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

Может кто-нибудь привести пример этого?

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

Пример очень помог бы и был бы высоко оценен.

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

2 ответа

Решение

Допустим, у вас есть следующий класс:

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 соответственно, потому что все действия потока A, которые были выполнены до записи в volatile c, гарантированно будут видны потоку, который прочитал новое значение c.

Насколько я понял текст документа, если к полю применен модификатор volatile , то он гарантирует следующее: если в коде изменено volatile-field, то это изменение произойдет после всех предшествующих ему операций, и перед всеми операций, следующих за ним, и это будет иметь место для всех потоков приложения.

Другие вопросы по тегам