Насколько мне известно volatile writeпроисходит-доvolatile read, поэтому мы всегда будем видеть самые свежие данные в volatile переменной.Мой вопрос в основном касается термина происходит-дои где это происходит? Я написал кусок кода, чтобы уточнить мой вопрос.
class Test {
volatile int a;
public static void main(String ... args) {
final Test t = new Test();
new Thread(new Runnable(){
@Override
public void run() {
Thread.sleep(3000);
t.a = 10;
}
}).start();
new Thread(new Runnable(){
@Override
public void run() {
System.out.println("Value " + t.a);
}
}).start();
}
}
(блок try catch опущен для ясности)
В этом случае я всегда вижу значение 0, которое будет напечатано на консоли. Без Thread.sleep(3000);
я всегда вижу значение 10. Является ли это случаем отношения «происходит до» или оно печатает «значение 10», потому что поток 1 начинается немного раньше потока 2?
Было бы здорово увидеть пример, где поведение кода с переменной volatile и без нее различается при каждом запуске программы, потому что результат кода выше зависит только (по крайней мере, в моем случае) от порядка потоков и от потока спать.