java内存模型面试题_一道面试题引发的对Java内存模型的一点疑问,第二部。

环境信息如下:

JDK版本:1.8.0_251

e1f4ae61754893898365e79df3ddd8cd.png

java.vm.version=25.251-b08

java.vm.vendor=Oracle Corporation

java.vm.name=Java HotSpot™ 64-Bit Server VM

java.vm.specification.name=Java Virtual Machine Specification

java.runtime.version=1.8.0_251-b08

os.arch=amd64

sun.management.compiler=HotSpot 64-Bit Tiered Compilers

java.vm.info=mixed mode

操作系统信息:

c7bd9091dd7cbd0492f901ab20cfe88c.png

原问题

基于原来的问题,我又发现一个很奇怪的现象。

第一个问题:

如图

8ca0a71ebf27fa589249b5ebba9b2fe9.png

第二个问题:

按照我的理解,这个程序如果Main线程在num=0时候先执行了while()循环,然后子线程再对num进行加1操作,肯定会出现死循环的情况。因为JMM规定普通的共享变量存在于主内存当中,然后每个线程都有自己的工作内存,每个线程用到变量的时候会先从主存中复制一份到自己的工作内存。就你这程序来说,如果Main线程在num=0时候先执行了while()循环,这个时候Main线程会把num的值复制一份到自己的工作内存,然后Main线程的while循环就只会读线程工作内存的副本。接下来子线程开始运行,子线程先把num的值复制一份到子线程的工作内存里面,然后对num进行加1操作,然后子线程运行结束把num刷新到主存里面。注意,即使此时子线程把num的最新值刷新到主存中,Main线程的while循环也不会结束,因为Main线程只会读自己的工作内存里面num的值,Main线程的工作内存里面的num现在还是0啊。

你的num没有用volatile修饰,所以Main线程里面的num不会失效。

(请大顺便解释一下我这个疑惑,就上面加粗这行的疑惑。)

所以,我觉得你这个程序只要Main线程在num=0时候先执行了while()循环,然后子线程再对num进行加1操作,即使没有jit的激进编译,也肯定会出现死循环的情况。

不过我发现我上面的说法也不对。我发现加了-Xint参数之后,就肯定不会出现死循环了。这是为什么呢?难道加了-Xint参数之后,Main线程每次循环的时候都会去主存中读取num的值吗?这跟JMM规定的不太一样啊?JMM规定普通的共享变量存在于主内存当中,然后每个线程都有自己的工作内存。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值