对于volatile可见性的理解,大佬们看看对吗?

小弟对于volatile可见性的理解有点迷,不知道自己理解是否正确,希望大佬可以指点下。

场景:多核CPU下的volatile,每个核有自己的缓存,它们当然也有共享缓存

volatile写时通过"store"操作把volatile变量强行从缓存立即刷新回到主存中,这个时候数据会在总线传播,其他核会发现 volatile变量已经发生改变,于是把自身volatile变量的缓存变无效化,下次读取这个volatile变量时发现缓存无效,所以会从主存读取 最新的值到缓存再进行CPU运算,这样子就体现了volatile的可见性,对变量的修改会导致所有核都能看到最新值


但是volatile不能保证原子性,我的理解是这样子的,A线程先把volatile变量读取到自身缓存中,并且加载到A线程的局部变量表中了,时间片 停止了,B线程对volatile变量作了修改,A线程得到时间片继续运行,这个时候A缓存的volatile变量已经无效化了(因为其他线程修改了), 但是A线程不会再次读取volatile变量了(因为已经在局部变量表存在了,所以局部变量表的值是过时的值),所以A线程运算操作时,还是会按以前局部 变量表读取的结果运算,导致数据不一致的问题。所以不能保证原子性。

假若A线程得到时间片停止时,只是把值读取到缓存,没有把volatile变量读取进去局部变量表,那么下次恢复时间片时,应该还是可以读取 volatile的最新值吧,因为后面即使B线程修改volatile变量,会让其他缓存无效化,下次A线程恢复时发现自身缓存失效,会再 次"load",保证读取到最新值。

上面就是我对volatile保证可见性,不保证原子性的理解,不知道是否理解错,希望大佬们给点意见。

不保证原子性是因为对变量做了复合性操作,就是既有读取又有写入的操作,例如:++。

线程A的volatile变量读取完之后,时间片用完,线程B对volatile共享变量进行修改,尽管volatile能够保证修改能够被其他线程看 见,但是前提是线程再次读取变量,线程A后面又拿到时间片运行线程,但是不会再次读取变量,所以写入操作是基于以前读取的数据,所以并发时会出现问题,是 这样子理解吗

原子性是肯定保证不了的,因为对变量有复合操作!

当a 读取到写入的过程中,可能被其他进程写入,这时候a再写入的话会覆盖其他的线程结果,不能保证准确性。复合性只是举个例子,类似复合性的操作也不能保证原子性。例如:
volatile int a=0;
 {
t=a;
t=t+1;
a=t;
}

我好像理解了,我想问的感觉不是原子性的问题,可能说volatile线程安全的问题更合适些,volatile之所以不保证安全,应该是因为cpu从缓存读取值到寄存器后,不管后面的缓存数据是否因为别人的修改而失效,都不会再次从缓存读数据了,所以即使知道缓存失效了,但是cpu不会重新读取最新的数据而读取最原始的数据

这个我是知道的,哈哈!就是想了解里面的具体细节。线程A把a变量=0读取之后,时间片停止,B线程读取a变量并且++,刷新回到主存,此时a=1,并且 此时线程A的对应a的缓存已经失效(缓存一致性),但是a=0已经被加载到寄存器,不会因为缓存失效而重新读取a变量,所以运算的时候还是会按 照 0++ = 1算出a=1,最后刷新内容回到主存,结果还是为1。

以前好奇为什么线程B修改之后,线程A还是用旧数据运算,因为可见性的概念不是这么说的,以为违背了可见性。其实并没有违背,因为线程B修改时,线程A的 缓存已经失效了,其实是符合可见性的,只不过后面cpu不会从缓存取数据了(在时间片停止前已经取出,后面不管缓存是否失效不会再次读取)

这里说的原子性是说让volatile的变量能成为原子性,但是volatile明显还是不能把变量变成原子性,这里需要用到synchronized把一段语句变为lrc原子性。

同步的过程其实就是让语句原子性的过程。

同步的过程就是让语句原子性的过程

因为已经在局部变量表存在了,所以局部变量表的值是过时的值。这句话,什么意思?每个线程的除了有自己的工作内存,还有局部变量区????

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值