以下代码有时会在我的Windows-PC和Mac上打印"valueWrapper.isZero()",它们都在服务器模式下运行它们的JVM.确定发生这种情况是因为值字段在ValueWrapper类中不是最终的,因此某些线程可能会看到过时值0.
public class ConcurrencyApp {
private final Random rand = new Random(System.currentTimeMillis());
private ValueWrapper valueWrapper;
private static class ValueWrapper {
private int value;
public ValueWrapper(int value) {
this.value = value;
}
public boolean isZero() {
return value == 0;
}
}
private void go() {
while (true) {
valueWrapper = new ValueWrapper(randomInt(10, 1024));
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
if (valueWrapper.isZero()) {
System.out.println("valueWrapper.isZero()");
}
}
});
thread.start();
}
}
private int randomInt(int min, int …Run Code Online (Sandbox Code Playgroud)