Java多线程基础 07.Compare-And-Swap

Java多线程基础 07.Compare-And-Swap

Compare-And-Swap

  Compare-And-Swap(之后简称CAS)是支持并发的第一个处理器提供的原子操作。,CAS操作包含三个操作数——内存位置(V)、预期原值(A)和新值(B)。如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值。否则,处理器不做任何操作。无论哪种情况,它都会在CAS指令之前返回该位置的值。

  CAS的特性使得其成为了解决多线程并行情况下使用锁造成性能损耗的一种方案。

  在 Intel 处理器中,比较并交换通过指令的 cmpxchg 系列实现。

Java中的CAS

  在JDK1.5之后,Java程序中才可以使用CAS操作,该操作由sun.misc.Unsafe类里面的compareAndSwapInt()和compareAndSwapLong()等几个方法包装提供,虚拟机在内部对这些方法做了特殊处理,即时编译出来的结果就是一条平台相关的处理器CAS指令,没有方法调用的过程,或者可以认为是无条件内联进去了。

public final native boolean compareAndSwapObject(Object object, long valueOffset, Object expect, Object update);

public final native boolean compareAndSwapInt(Object object, long valueOffset, int expect, int update);

public final native boolean compareAndSwapLong(Object object, long valueOffset, long expect, long update);

  由于sun.misc.Unsafe类不是提供给用户提供调用的类(Unsafe.getUnsafe()的代码中限制了只有启动类加载器(Bootstrap ClassLoader)加载的Class才能访问它),因此,如果不采用反射手段,我们只能通过其他的Java API来间接使用它,如J.U.C包里面的AtomicInteger类,其中的 compareAndSet()和 getAndIncrement()等方法都使用了 Unsafe 类的 CAS 操作。

ABA问题

核心思路: 加版本号 AtomicStampedReference

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值