Почему volatile в Java 5+ не обеспечивает видимость из другого потока?

Согласно:

http://www.ibm.com/developerworks/library/j-jtp03304/

В новой модели памяти, когда поток A записывает в volatile переменную может V, а поток B читает из V, любые значения переменных, которые были видны A во время записи V, теперь гарантированно будут видны B

. И во многих местах в Интернете указано, что следующий код никогда не должен печатать «ошибка»:

public class Test {
    volatile static private int a;
    static private int b;

    public static void main(String [] args) throws Exception {
        for (int i = 0; i < 100; i++) {
            new Thread() {

                @Override
                public void run() {
                    int tt = b; // makes the jvm cache the value of b

                    while (a==0) {

                    }

                    if (b == 0) {
                        System.out.println("error");
                    }
                }

            }.start();
        }

        b = 1;
        a = 1;
    }
}

bдолжно быть 1 для всех потоков, когда aравно 1.

Однако иногда я получаю «ошибку» . Как это возможно?

69
задан David Schwartz 26 July 2017 в 22:03
поделиться