一针见血系列[7]: volatile离我们很近,很亲切,不该陌生

栏目:一针见血 作者:admin 日期:2018-10-29 评论:1 点击: 110 次

synchronized代码块儿里面的变量都实现了内存可见性。内存可见性的底层是CPU的指令实现的。volatile修饰的是变量,它的作用也是实现内存可见性,底层用的用的同一个CPU指令。可以这样理解:synchronized里面的变量都是volatile修饰的。

我们都用过synchronized,但是用viotile机会很少,其实换个角度想想,synchronized里面的变量完全可以看做被volatile修饰,这样一想,是不是感觉volatile离我们很近,很亲切,不陌生了。


文章下面的提问来源于群里的成员:volatile除了保证内存可见性,还有个作用是防止指令重排。关于这一点,我想做一个说明和补充。
这个成员提出:jvm会对new对象的过程进行指令重排,先分配空间,再把空间地址返回给变量,最后才进行对象实例化,加了volatile后会强制先进行实例化,最后才把对象地址返回被变量。

我觉得:指令重排是不是最终的思想来源还是内存可见性呢?如果两个互不相关的思想,用到一个事物上,感觉怪怪的。我后来想了想:寄存器和主存的隔离造成了数据的不一致,volatile的初衷是保证数据的强一致性,当赋值基本简单类型的时候,这种一致性很容易实现。但是赋值对象类型的时候,这种一致性分为强一致性和弱一致性,重排是弱一致性,而有序则是强一致性,volatile的目的是强一致性,所以最终它要求指令不得重排。现在我感觉可以把可见性和有序性都统一到一致性上面了。

网站公告
欢迎加入金燕知识社群,更多介绍请查阅:知识社群

一针见血系列[7]: volatile离我们很近,很亲切,不该陌生:目前有1 条留言

  1. 沙发
    fatedw:

    这样理解不对吧,volatile除了保证内存可见性,还有个作用是防止指令重排

    2018-11-07 下午12:26 [回复]

发表评论


------====== 本站公告 ======------
金丝燕网,即将迎来四周年!