volatile(轻量锁)

目录

定义

特点

缺点

原理

volatile锁的性能优化:(追加64字节)


定义

在java规范中定义为: Java 言允 许线 访问 共享 量, 了 确保共享变 量能被准确和一致地更新, 线 应该 确保通 排他 锁单 量。 Java 言 提供了volatile ,在某些情况下比 要更加方便。如果一个字段被声明成 volatile Java 线 程内存 模型确保所有线 程看到 量的 是一致的。(简单的说就是读出来的值肯定是正确的,但是写不一定)。

特点

效率高快,更适合读操作,

缺点

不能保证写的准确性,volatile 仅能使用在变量级别

原理

 

 

被volatile修饰的变量进行写的时候,会多出一行汇编代码,Lock前缀的命令会发生两件事情
1、将当前处理器的缓存行的数据写回到系统内存。
2、同时这个写回内存的操作会使CPU里引用了相同的地址数据失效。
注意:一般Lock不会锁地址总线,只是锁住的CPU地址缓存,如果锁住总线,会导致其他线程无法运行,降低执行效率,造成CPU浪费

volatile锁的性能优化:(追加64字节)

Java 发编 程大 Doug lea JDK 7 的并 包里新增一个 列集合 Linked- TransferQueue,它在使用 volatile ,用一种追加字 的方式来 列出 和入 的性能,这种方式看起来很神奇,他当中有一个内部类AtomicReference,这个内部类只做了一件事情,就是将共享变量追加到64字节。我们可以来计算下,一个对象的引用占4个字节,它追加了15个变量(共占60个字节),再加上父类的value变量,一共64个字节。
为什么追加64字节能够提高并发编程的效率呢?
为对于CPU的 L1 L2 L3 存的高速 存行是 64 个字 节宽 ,不 支持部分填充缓 存行, 意味着,如果 列的 头节 点和尾 点都不足 64 理器会将 它们 到同一个高速 存行中,在多 理器下每个 理器都会 存同 、尾 点,当一 个处 理器 试图 修改 头节 ,会将整个 存行 定,那么在 存一致性机制的作用下,会 致 其他处 理器不能 访问 自己高速 存中的尾 点,而 列的入 和出 操作 需要不停修改 点和尾 点,所以在多 理器的情况下将会 重影响到 列的入 和出 效率。 Doug lea 使 用追加到64 的方式来填 高速 冲区的 存行,避免 头节 点和尾 点加 到同一个 存 行,使头 、尾 点在修改 不会互相 定。
也并不是所有的volatile变量都需要追加到64字节。
1、当缓存不是64字节处理器的时候/  2、或者变量不需要频繁写的时候

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值