Согласно:
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.
Однако иногда я получаю «ошибку» . Как это возможно?