原子操作CAS

2020-09-23  本文已影响0人  传达室马大爷

原子

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

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

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所带来的问题

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

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

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

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

JDK中所带的原子操作类
上一篇 下一篇

猜你喜欢

热点阅读