打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
volatile 和 缓存一致性协议 mesi的关系

在Java中,volatile是个很高层面的规范,保证了指令不会被重排序+对volatile变量的写使得当前cpu缓存中的所有变量写回到主存中,从而保证了内存可见性。

具体的实现是靠JVM和cpu(还有操作系统?)合作实现的,不管cpu有没有mesi协议,用了volatile,JVM都会保证可见性,只不过实现方式是不一样的。

有个问题就是:mesi似乎已经保证了线程之间的可见性,那么在实现了mesi协议的cpu上,volatile关键字其实是不是没用的?

答案是:还是有用的,就算在实现了mesi的cpu上,volatile一样不可或缺。除了禁止指令重排序的作用外,由于mesi只是保证了L1-3 的cache之间的可见性,但是cpu和L1之间

还有像storebuffer之类的缓存,而volatile规范保证了对它修饰的变量的写指令会使得当前cpu所有缓存写到被mesi保证可见性的L1-3cache中。(具体的实现,以X86体系为例,

volatile会被JVM生成带lock前缀的指令)。

扯两句远的:

1、i++的问题是写更新丢失的问题,跟现在说的没关系,要用cas解决。

2、cas其实不是原子性操作,要读一次,再写一次。但是可以用MESI实现原子性:读一次发现是目标值,写的时候判断是不是I就可以。mesi实现其他原子性操作也是这个思路。

3、从2可以看出,悲观锁和乐观锁并不是对立的两件事,以数据库版本号实现乐观锁为例,update要锁行,这个又是悲观锁,而锁行(可能)要用cas去操作volatile变量,这又是乐观锁,然而底层mesi实现原子性的时候,写的时候需要知道现在的缓存行有没有失效,这就一定需要cpu核心之前有一个同步锁,这个又是悲观锁。所以纠结于名词是没有意义的,知道到底发生了什么事情更重要。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
面试官想到,一个Volatile,敖丙都能吹半小时
Java程序员面试必备:Volatile全方位解析
JVM内存模型总结
Java 多线程三大核心
快速掌握并发编程---深入了解volatile
cpu缓存和volatile
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服