为了账号安全,请及时绑定邮箱和手机立即绑定

java并发问题

java并发问题

MMTTMM 2019-02-03 23:59:26
 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 回答

?
皈依舞

TA贡献1851条经验 获得超3个赞

大概是内存可见性问题

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


查看完整回答
反对 回复 2019-02-03
  • 1 回答
  • 0 关注
  • 403 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信