volatile如何保证可见性

volatile是如何保证可见性的呢?

在X86处理器下通过工具获取JIT编译生成的汇编指令来查看对volatile进行写操作时,CPU会做什么?

java代码:

instance = new Singleton(); // instance是volatile变量

转变成汇编代码

0x01a3de1d: movb $0×0,0×1104800(%esi);
0x01a3de24: lock addl $0×0,(%esp);

有volatile修饰的共享变量进行写操作的时候会多出第二行汇编代码,通过查IA-32架构软件开者手册可知,Lock的指令在多核理器下会引了两件事情:

1、将当前处理器缓存行的数据写回到系统内存

2、这个写回内存的操作会使在其它CPU里缓存了盖内存地址的数据无效

详细解释:

        为了提高 理速度, 理器不直接和内存 行通信,而是先将系 内存的数据 到内部 存( L1 L2 或其他)后再 行操作,但操作完不知道何 会写到内存。如果 声明了 volatile 的变量 行写操作, JVM 就会向 理器 送一条 Lock 的指令,将 量所在 存行的数据写回到系统 内存。但是,就算写回到内存,如果其他 理器 存的 值还 是旧的,再 算操作就会有问题 。所以,在多 理器下, 了保 各个 理器的 存是一致的,就会 实现缓 存一致性协议 ,每个 理器通 嗅探在 总线 播的数据来 检查 自己 存的 是不是 期了,当处理器 发现 自己 存行 对应 的内存地址被修改,就会将当前 理器的 存行 置成无效状态,当 理器 对这 个数据 行修改操作的 候,会重新从系 内存中把数据 理器 存里。

参考资料:Java并发编程的艺术

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值