通俗易懂:volatile怎么保证可见性和有序性?

前言

你好!如果你看到这里我默认你具备基本的并发编程能力。
随着硬件的能力扩展,软件性能提升中的硬件的“免费的午餐”似乎暂时的到了一个瓶颈期,所以在性能提升中软件多线程成了主要的面包。在进入多线程编程后我们会涉及三个主要的并发概念即:可见性 原子性和有序性。

可见性

什么是可见性?

所谓的可见性就是指可见性是指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。

其根本原因是因为每一个线程拥有主内存的一个副本,其运行过程中是使用副本中的数据,最后会将副本中的数据写回主存。那么就存在一个多线程对一个变量的操作结果被覆盖的问题。就是说A线程修改一个变量值后,B线程还在使用老的值最终导致数据不一致。

其实我们也能扩展开想到:线程不安全的一个重要原因就是数据不可见性导致。

volatile与可见性

volatile底层的原理还是汇编语言lock加锁实现。

1.Lock前缀指令会引起处理器缓存写回到内存
当对volatile变量进行写操作的时候,JVM会向处理器发送一条lock前缀的指令,将这个缓存中的变量回写到系统主存中
2.一个处理器的缓存回写到内存会导致其他处理器的缓存失效
处理器使用***嗅探技术***保证内部缓存系统内存和其他处理器的缓存数据在总线上保持一致。
如果一个变量被volatile所修饰的话,在每次数据变化之后,其值都会被强制刷入主存。而其他处理器的缓存由于遵守了缓存一致性协议,也会把这个变量的值从主存加载到自己的缓存中。这就保证了一个volatile修饰的变量在并发编程

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值