volatile与MESI缓存一致性协议
volatile
volatile是Java虚拟机提供的轻量级的同步机制。
- 不能保证原子性
- 保证volatile修饰的共享变量对所有线程是可见的。也就是当一个线程修改 了一个被volatile修饰共享变量的值,新值总是可以被其他线程立即得知。
- 禁止指令重排序
关于volatile的相关知识点,已经在以下两篇博文中详细解释了。
volatile详解1
volatile详解2
实例

volatile为什么会保证有序性?而不能保证原子性?
在对volatile属性进行操作的代码转换为汇编语言语言时,汇编指令代码有lock指令;
查看关于Lock资料:
- LOCK(前缀) 代表的是总线锁,这个指令对应用程序有用且允许被应用程序使用。
- 其在修改内存操作时,使用 LOCK 前缀去调用加锁的读-修改-写操作(原子的)。这种
机制用于多处理器系统中处理器之间进行可靠的通讯。 - 具体描述如下:
在 Pentium 和早期的 IA-32 处理器中,LOCK 前缀会使处理器执行当前指令时产生
一个 LOCK#信号,这总是引起显式总线锁定出现

本文围绕Java中的volatile展开,它是轻量级同步机制,能保证共享变量可见性、禁止指令重排序,但不能保证原子性。还介绍了多级缓存结构、总线锁,重点阐述多核CPU多级缓存一致性协议MESI,包括其缓存状态、状态转换及优化引入的问题,如使用存储缓存解决CPU切换状态阻塞。
最低0.47元/天 解锁文章
1678

被折叠的 条评论
为什么被折叠?



