[编程思想录]无锁之CAS

一、背景

解决线程并发产生的问题,除了锁,volatile等关键字之外,在特定的情景下为了提高代码运行的效率,为了摆脱“锁”这个独占式的编程方式之外,还有另外一个原子类的概念。
在java.util.concurrent.atomic包下有Java提供的线程安全的原子类,比如AtomicInteger。而这些原子类就用到了CAS机制,下面我们就来了解一下 CAS机制

二、CAS原理

原子类 线程安全 非阻塞,底层没有锁,底层实现原理为CAS无锁技术,就是比较再交换:compare and swap
CAS包含三个参数(V,E,N)V表示要更新的变量,E表示预期值,N表示新值。
● V=需要去更新的变量(主内存的共享变量)
● E=预期值(本地内存的副本)
● N=新值
仅当V值等于E值时,才会将V的值设为N,如果V值和E值不同,则说明已经有其他线程做了更新,则当前线程什么都不做。最后,CAS返回当前V的真实值。
如果V=E(主内存的值与本地内存的值一致,说明没人修改),将V的值设置为N。
如果V不等于E(主内存的值跟本地内存的不一致),已经被修改。这样的情况下,就将E的值设置成V的值,重新刷新,再比较。看下源码,无非就是一个无限刷新,知道V和E的值一致。
在原子类中大量使用到CAS。

三、CAS运用案例

1. AtomicInteger的实现

要想实现这种自赠的效果就需要加锁,为了提高效率,这种场景下原子类型就可以胜任。

AtomicInteger ai =new AtomicInteger(1);
ai.incrementAndGet();

查看实现代码:

 /**
     * Atomically increments by one the current value.
     *
     * @return the updated value
     */
    public final int incrementAndGet() {
   
        return U.ge
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Mr.Letian

您的打赏是我最大的动力

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

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

打赏作者

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

抵扣说明:

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

余额充值