开发者社区> 问答> 正文

如何理解volatile不能保证原子性,也就不能保证线程安全?

哪位大神解释下[volatile不能保证原子性,也就不能保证线程安全]这句话

展开
收起
蛮大人123 2016-03-25 17:56:28 6493 0
2 条回答
写回答
取消 提交回答
  • volatile只是保证可见性,不用于保证线程安全,线程安全只能使用原子变量或者加锁 参考:https://www.ibm.com/developerworks/cn/java/j-jtp06197.html
    2019-07-17 19:14:53
    赞同 展开评论 打赏
  • 我说我不帅他们就打我,还说我虚伪

    简单来说,volatile在多cpu环境下不能保证其它cpu的缓存同步刷新,因此无法保证原子性。
    还是以最常用的i++来说吧,包含3个步骤
    1,从内存读取i当前的值
    2,加1
    3,把修改后的值刷新到内存
    对于普通变量来说多线程下1,2之间被中断,其它线程修改了i的值,那原来已经在1,2之间被中断的线程的i的值就已经无效了,所以多线程是不安全的。
    另外对于普通变量来说,步骤1并不是每次都会从内存中读取,步骤3也并不会每次都保证会立即刷新到内存,详情见线程缓存的相关文章。
    所以这里有两个问题,可见性和原子性,viloate只能保证可见性,即步骤1每次都重新读,步骤3每次都立即刷新到主内存。但1,2之间仍然会被中断,多个线程交叉修改,所以仍然不安全。

    2019-07-17 19:14:53
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
多IO线程优化版 立即下载
原子变量与内存模型 立即下载
多线程 立即下载