Ответ 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.