volatile在i++情况下失效

来源:互联网 发布:辐射4低配优化 mod 编辑:程序博客网 时间:2024/06/05 17:18

参考文章: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++的操作到底是怎样的,还待日后研究了虚拟机再补上!

原创粉丝点击