Посмотрите эту простую программу на Java:
import java.util.*;
class A {
static B b;
static class B {
int x;
B(int x) {
this.x = x;
}
}
public static void main(String[] args) {
new Thread() {
void f(B q) {
int x = q.x;
if (x != 1) {
System.out.println(x);
System.exit(1);
}
}
@Override
public void run() {
while (b == null);
while (true) f(b);
}
}.start();
for (int x = 0;;x++)
b = new B(Math.max(x%2,1));
}
}
Основной поток
Основной поток создает экземпляр B
с x
, установленным в 1, затем записывает этот экземпляр в статическое поле A.b
. Он повторяет это действие навсегда.
Опрос темы
Опрокидывается опрос, пока он не обнаружит, что A.b.x
не 1.
?!?
Половина времени, когда он идет в бесконечном цикле, как и ожидалось, но в половине случаев я получаю этот вывод:
$ java A
0
Почему поток опроса способен видеть B
, у которого x
не установлено значение 1?
x%2
вместо просто x
здесь просто потому, что проблема воспроизводится вместе с ним.
Я запускаю openjdk 6 на linux x64.