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);
}
}為什么上述代碼不能停止運(yùn)行,改成volatile就可以,測試框架用的concurrent-junit。
1 回答

皈依舞
TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超3個(gè)贊
大概是內(nèi)存可見性問題
什么都不做(不volatile 不lock 等)時(shí)JVM不保證一線程能讀到其他線程的寫
添加回答
舉報(bào)
0/150
提交
取消