Объяснение изменчивых переменных в документах 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, то это изменение произойдет после всех предшествующих ему операций, и перед всеми операций, следующих за ним, и это будет иметь место для всех потоков приложения.