volatile在i++情况下失效

参考文章:Java并发编程:volatile关键字解析

在上述文章中对volatile以及多线程的内存模型有所讲述,但是当我看到下面这段时产生了疑问:

 解释到这里,可能有朋友会有疑问,不对啊,前面不是保证一个变量在修改volatile变量时,
 会让缓存行无效吗?然后其他线程去读就会读到新的值,对,这个没错。这个就是上面的
 happens-before规则中的volatile变量规则,但是要注意,线程1对变量进行读取操作之
 后,被阻塞了的话,并没有对inc值进行修改。然后虽然volatile能保证线程2对变量inc的值
 读取是从内存中读取的,但是线程1没有进行修改,所以线程2根本就不会看到修改的值。

我觉得作者这样的解释太牵强了,因为当线程2执行写入操作后,会将线程1的缓存行变为无效,这样线程1的inc值应该更新才对啊!作者应该把这里也解释了才对,而不仅仅是如原文中那样只去解释一个特殊情况。

后面,经过我努力,我的理解是:i++这个操作是非原子性的,假设它里面有三个操作,a : 读取i的值,b : 将i增加1,c : 写入主存。这样的话,当我们线程1执行完a操作后,切换到线程2,待线程2的i++操作执行完后,线程1的缓存行失效,但是因为在线程1中,a操作(读取i的值)已经执行过了,无需再去读取i的值,所以缓存行是否更新也就无关紧要了,待线程1执行完b,c操作后,自然会得到错误的答案。

至于i++的操作到底是怎样的,还待日后研究了虚拟机再补上!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值