java并发问题

  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。

阅读 1.7k
2 个回答

大概是内存可见性问题

什么都不做(不volatile 不lock 等)时JVM不保证一线程能读到其他线程的写

建议直接把代码或者库贴出来,以便具体分析。或者项目包。
不然如果想看你当前的jar 源码,或者调试还得自己搭建环境。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题