Volatile в java

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

12
задан maks 4 June 2012 в 21:00
поделиться