Насколько я знаю, волатильная запись бывает-до 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 и без нее различается в каждом запуске программы, потому что результат кода выше зависит только (по крайней мере в моем случае) от порядка потоков и потока спать.