CAS原子类

java.util.concurrent.atomic 

CAS是什么

 cas中文翻译是比较并交换,实现并发算法时常用到的一种技术。它包含三个操作数-内存位置、预期原值和更新值。

执行cas操作的时候,将内存位置的值和预期原值比较,如果匹配,那么处理器会自动将该位置的值更新为新值,如果不匹配,处理器不做任何操作,多个 线程同时执行cas操作只能一个成功。 

cas硬件级别的保证

源码级别

 cas底层原理?如果知道,谈谈对unsafe的理解。

i++线程不安全,使用atomicInteger.getAndDecrement()的理解

 执行例子

从汇编角度分析

 总结话术

CAS是靠硬件实现的从而在硬件层面提升效率,最底层还是交给硬件来保证原子性和可见性,实现方式是基于硬件平台的汇编指令,在intel的cpu中(x86机器上),使用的是汇编指令cmpxchg指令。

核心思想就是:比较要 更新变量的值V和预期值E,相等才会将V的值设为新值N,如果不相等自旋再来。

AtomicReference的使用
AtomicReference<User> atomicReference =new AtomicReference<>();
        User zhangsan = new User("zhangsan", 1);
        atomicReference.set(zhangsan);
        User lisi = new User("lisi", 2);
        System.out.println(atomicReference.compareAndSet(zhangsan, lisi));
        System.out.println(atomicReference.get());

 结果

cas与自旋锁,借鉴CAS的思想

 自旋锁demo


public class SpinLockDemo {
    AtomicReference<Thread> atomicReference = new AtomicReference<>();
    public void lock(){

        Thread thread = Thread.currentThread();
        System.out.println(thread.getName()+"come in");
        while(!atomicReference.compareAndSet(null,thread)){

        }
    }
    public void unLock(){
        Thread thread = Thread.currentThread();
        atomicReference.compareAndSet(thread,null);
        System.out.println(thread.getName()+"task over ---------");
    }

    public static void main(String[] args) {
        SpinLockDemo spinLockDemo = new SpinLockDemo();
        new Thread(()->{
            spinLockDemo.lock();
            try {
                TimeUnit.SECONDS.sleep(5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            spinLockDemo.unLock();
        },"A").start();
        try {
            TimeUnit.MILLISECONDS.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        new Thread(()->{
            spinLockDemo.lock();
            spinLockDemo.unLock();
        },"B").start();

    }
    
}

 cas的缺点

 1 循环时间长 开销大

2 引出ABA问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值