挑灯夜读——Java并发机制:volatile的应用

Java并发机制的底层实现原理(一)

1、volatile的应用

  • 定义:volatile是一种轻量级的synchronized锁,它的主要作用就是确保我们的共享变量“可见性”,也就是多线程中,当一个线程对共享变量的值进行了修改,这种变化也能够让其它线程清晰的知道。

也就是说,在volatile修饰下,能够确保共享变量得到准确和统一的更新,线程应该通过排它锁来单独获取这个变量。

底层原理
  • 在有该修饰的变量代码中,其转汇编代码后,存在以Lock前缀添加的操作。
//形如
lock add 00
  • 这样的操作,使其多处理器中出现了以下两种情况:
    一、使当前缓存器缓存的内容写回至内存
    二、上面的写回的操作,使其它CPU缓存的该内存地址的数据无效
娓娓道来
  • 1)Lock前缀指令会引起处理器缓存写回到内存

1、用通俗易懂的话解释就是,我们在底层的数据操作中,使用了lock锁对数据的限制。我们的处理器有cache(缓存器),这个是为了中间协调我们的内存和CPU处理速度差距太大的情况,而设计的一种处理器模式。我们在数据操作中,并不会频繁的调用内存的数据,而是先在cache中寻找。
2、这种寻找就会延伸出如:缓存命中(也就是在缓存中找到了我们需要读取的值)、写命中(写的操作数在缓存中找到)以及其它种种。
3、一个线程对共享变量进行修改时,在下一个变量得到锁,进行下一步修改之前,因为volatile的优化,会使我们线程修改的变量被立即写入内存中,而不是放在缓存中,就释放锁。

  • 2)缓存写到内存会导致其它处理器的缓存无效

这里的形容就比较抽象,我们的多处理器,或者多线程在对共享变量进行操作时,都会有一个叫做嗅探的东西来检测我们的其它处理器变化,并起到很大的作用,比如。上述的一个线程在将共享变量写回到内存后,其它处理器中储存的该内存地址的数据就会失效,失去它的作用。

volatile的优化
  • 使用一个叫做linkedTransferQueue的队列集合类来在缓存中追加字节,这样的追加可以用下面的图来解释:
    在这里插入图片描述
  • 上图就是追加64字节的一种优化速度的方法。
  • 当然,并不是只要追加到64字节就会提高性能,假如缓存的宽是32位。又或者我们不会频繁对其进行调用。这样追加的方式并不会提高性能。
  • 以上是本次的小总结!

!心感想:也算是选择了这条路,既然选择了,咱们就去拼去闯。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

米店不卖你

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值