当前位置 > it书童 > java > 正文

CAS-不可中断的典范

java it书童 2021-01-09 17:18:10 0赞 0踩 296阅读 0评论

什么是CAS

我认为 V 的值应该是 A, 如果是的话我就把它改成 B,如果不是 A (说明已经被别人修改过了),那我就不修改了,避免多人同时修改导致出错

当且仅当预期值 A 和内存值 V 相同时,才将内存值修改为 B

利用了 CPU 的特殊指令,保证了原子性,先比较再更新,在 CPU 层面实现了原子性

CAS的等价代码

package juc.lock.cas;

/**
 * 模拟 CAS 操作
 */
public class TwoThreadsCompetition implements Runnable {

    private volatile int value;

    public synchronized int compareAndSwap(int expectedValue, int newValue) {
        int oldValue = value;
        if (oldValue == expectedValue) {
            value = newValue;
        }
        return oldValue;
    }

    @Override
    public void run() {
        compareAndSwap(0, 1);
    }

    public static void main(String[] args) throws InterruptedException {
        TwoThreadsCompetition r = new TwoThreadsCompetition();
        r.value = 0;
        Thread t1 = new Thread(r);
        Thread t2 = new Thread(r);
        t1.start();
        t2.start();
        t1.join();
        t2.join();
        System.out.println(r.value);
    }
}

CAS的应用场景、源码分析

  • 乐观锁

  • 并发容器

  • 原子类

CAS的缺点

  • ABA 问题:可以用版本号来解决此问题

  • 自旋时间长

关于我
一个文科出身的程序员,追求做个有趣的人,传播有价值的知识,微信公众号主要分享读书思考心得,不会有代码类文章,非程序员的同学请放心订阅
转载须注明出处:https://www.itshutong.com/articles/1020