В соответствии с:
http://www.ibm.com/developerworks/library/j-jtp03304/
В новой модели памяти, когда поток A записывает в изменчивую переменную 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.
Однако я иногда получаю сообщение об ошибке. Как это возможно?