志远的gravatar头像
志远2021-09-22 15:08:51

Java volatile值获取的问题

volatile型变量是每次都从主内存中重新获取变量, 还是基于MESI 协议, 只有当前处理器嗅探到了缓存中存储的值已经被修改而无效, 才从主内存中获取呢

所有回答列表(1)
NYQFJGK的gravatar头像
NYQFJGK LV12021年12月29日

作者:酒行客
链接:https://www.zhihu.com/question/31990408/answer/106725626
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

在多线程编程中,我们最常用的是synchronized,而对volatile的使用,却相对较少。这一方面是因为volatile的使用场景限制,另一方面是volatile使用需要更高的技术水平。

我们先来看一幅java内存模型图:

 

Java volatile值获取的问题

 

每一个线程都有相应的工作内存,工作内存中有一份主内存变量的副本,线程对变量的操作都在工作内存中进行(避免再次访问主内存,提高性能),不同线程不能访问彼此的工作内存,而通过将操作后的值刷新到主内存来进行彼此的交互,这就会带来一个变量值对其他线程的可见性问题。当一个任务在工作内存中变量值进行改变,其他任务对此是不可见的,导致每一个线程都有一份不同的变量副本。而volatile恰恰可以解决这个可见性的问题,当变量被volatile修饰,如private volatile int stateFlag = 0; 它将直接通过主内存中被读取或者写入,线程从主内存中加载的值将是最新的。

顶部客服微信二维码底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友