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++的操作到底是怎样的,还待日后研究了虚拟机再补上!
阅读全文
1 0
- volatile在i++情况下失效
- 索引在哪些情况下失效
- 索引在哪些情况下失效
- $.getJSON在ie下失效的情况
- C语言中volatile在什么情况下使用
- CSS3 在使用Modernizr的情况下导致animation失效
- Ajax在跨域情况下async:false失效
- easyui datagrid在fitColumns="true"的情况下失效
- 什么情况下,arguments失效?
- 解决Dropshadow滤镜在父容器有背景图片的情况下失效的问题
- cursor pointer 在 position absolute 情况下 IE 中失效的解决办法
- 关于jquery ajax()在谷歌,opear等浏览器下失效情况
- 在未贴brcm4330芯片的情况下,invensense的sensor失效问题分析
- STL中容器的迭代器在什么情况下会失效?
- 解决 MMDrawerController 滑动侧抽屉失效 在首页有UIScrollView的情况下
- 哪些情况下索引会失效?
- 哪些情况下索引会失效?
- 哪些情况下索引会失效
- 黑帽之家蜘蛛池
- c语言初步经典题---计算长方形的周长和面积
- 域名信息521js破解
- Server 2012 域用户添加本地管理员权限
- Servlet中HttpSession
- volatile在i++情况下失效
- mybatis映射文件中sql语句符号问题
- 1元钱可以买多少个糖果--面试题
- 终端设置代理
- 【哈希表】+【位图】+【布隆过滤器】
- jQuery操作dom
- Python学习记录——2048游戏实现
- Web服务器:Linux平台 + Nginx + uWSGI 安装,配置,解析,教程
- 关于Android Studio .9patch 图片报错