原子操作实现原理-学习笔记

  • 原子操作:不可被中断的一个或者一系列操作。
  • 缓存行(cache line):缓存的最小操作单位。
  • 比较并交换(compare and swap, CAS):CAS需要输入两个数值,一个旧值(期望操作前的值)和一个新值,在操作期间先比较旧值有无发生变化,如果没有变化才交换成新值,反之,则不交换。
  • 处理器实现原子操作 
    1. 处理自动保证基本内存操作的原子性。只保证单个字节的处理操作,复杂的内存操作处理器不能自动保证原子性。
    2. 使用总线锁保证原子性。处理器提供一个LOCK信号,当一个处理器在总线上输出此信号时,其它处理器的请求将被阻塞住。缺点:锁定期间,其它处理器不能操作其它内存地址,开销大。
    3. 使用缓存锁保证原子性。频繁使用的内存会缓存在处理器的L1,L2和L3高速缓存里,原子操作可以直接在处理器内部缓存中进行,不需要声明总线锁。当一个数据同时被两个以上处理器缓存以后,缓存的一致性会阻止同时修改处理器中缓存的数据。有两种情况不能使用缓存锁定:
  1. 当操作的数据不能被缓存在处理器内部,或操作的数据跨多个缓存行。
  2. 有些处理器不支持缓存锁定。
  • JAVA实现原子操作 
    1. 使用循环CAS实现原子锁–自旋CAS实现的基本思路就是循环进行CAS操作直到成功为止。
    2. CAS的问题: ABA问题-通过增加版本号/标志解决。循环时间长开销大。只能保证一个共享变量的原子操作–通过AtomicReference类来保证引用对象之间的原子性,把多个变量放在一个对象中进行CAS操作。
    3. 使用锁机制实现原子操作。锁机制保证了只有获得锁的线程才能够操作锁定的内存区域。实现有偏向锁、轻量级锁和互斥锁。其中后两种实现的方式都用到了循环CAS–当一个线程进入同步块时使用循环CAS的方式来获取锁,退出时使用循环CAS释放锁。

参考:

  1. Java SE 1.6 中的Synchronized
  2. Intel 64和IA-32架构软件开发人员手册
  3. 深入分析Volatile的实现原理
  4. http://www.infoq.com/cn/articles/atomic-operation

转载于:https://www.cnblogs.com/feichen-2018/p/8609015.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值