美文网首页
原子操作CAS

原子操作CAS

作者: 传达室马大爷 | 来源:发表于2020-09-23 14:23 被阅读0次

    原子

    原子:Atomic,原子的,不可分隔的最小单位

    Java基于阻塞的内置锁Synchronized的缺点

    • 阻塞的线程无法设置优先级,导致高优先级的线程一直无法被执行
    • 获取锁的线程一直不释放锁
    • 同时有且只有一个线程能获取到锁,其他线程都得阻塞等待,导致性能低下
    • 多个线程竞争锁,存在大量的竞争,消耗CPU资源,带来死锁或其他安全问题

    CAS原子原理

    CAS(Compare And Swap):利用现代处理器的CAS指令保障原子操作(比较和交换两部为一个原子操作)
    三个运算符:一个内存地址V,一个期望值A,一个新值B
    基本思路:如果地址V上的值与期望值A相等,就给地址V赋新值B,如果不是,则什么都不操作,然后在自旋(死循环)里不断执行CAS操作

    // 伪代码
    for(;;) {
        int oldValue = get();
        boolean isSuccess = compareAndSet(oldValue, newValue);
        if (isSuccess) {
            break;
        }
    }
    

    CAS所带来的问题

    • ABA问题(A -> B -> A)

    线程1执行get()返回A值
    在执行compareAndSet方法前,线程2执行了get()和compareAndSet()并成功将A值改成了B值
    线程3执行了get()和compareAndSet()并成功将B值改成了A值
    线程1执行compareAndSet()也会成功,但实际V地址上的值已被修改过

    解决方案:添加版本号标识(A1 -> B2 -> A3)

    添加一个版本号标识,在每次操作时版本号+1,判断时既要值相等,又要版本号相同,类似于数据库乐观锁

    • 开销问题

    长期执行不成功,不断循环重试,造成CPU开销

    • 只能保障一个共享变量的原子操作
    JDK中所带的原子操作类
    • 基本类型:AtomicInteger、AtomicBoolean、AtomicLong
    • 数组:AtomicIntegerArray、AtomicLongArray、AtomicReferenceArray
    • 引用类型:AtomicReference、AtomicMarkableReference、AtomicStampedReference
    • 原子更新字段类:AtomicReferenceFieldUpdater、AtomicIntegerFieldUpdater、AtomicLongFieldUpdater

    相关文章

      网友评论

          本文标题:原子操作CAS

          本文链接:https://www.haomeiwen.com/subject/twqoyktx.html