public class Apple {
public int a = 0;
public Apple() {
for (int i = 0; i < 50000; i++) {
a = i;
}
}
}
public class SimpleCounter {
Apple apple;
// volatile Apple apple;
public void setApple() {
apple = new Apple();
}
public Apple getApple() {
while (true) {
if (null != apple) {
return apple;
}
}
}
}
@RunWith(ConcurrentTestRunner.class)
public class TestSimpleCounter {
private SimpleCounter simpleCounter = new SimpleCounter();
@Test
public void testSetApple() {
simpleCounter.setApple();
}
@Test
public void testGetApple() {
System.out.println(simpleCounter.getApple().a);
}
}
为什么上述代码不能停止运行,改成volatile就可以,测试框架用的concurrent-junit。
大概是内存可见性问题
什么都不做(不volatile 不lock 等)时JVM不保证一线程能读到其他线程的写