15. 深入理解CAS

CAS 是什么?

CAS (compare and swap) :: 比较并交换

如果期望的值达到了,那么就更新,否则,就不更新,CAS 是 CPU 的并发原语

unsafe 类

Java 无法操作内存,但是Java 可以调用 C++, C++ 可以操作内存。unsafe 相当于 Java 的后门,可以通过这个类操作内存

    public final int getAndIncrement() {
        return unsafe.getAndAddInt(this, valueOffset, 1);
    }

// CAS 是自旋锁
public final int getAndAddInt(Object var1, long var2, int var4) {
        int var5;
        do {
            var5 = this.getIntVolatile(var1, var2);
        } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));

        return var5;
    }

CAS:比较当前内存中的值和主内存中的值,如果这个值是所期望的值,那么就执行操作,如果不是就一直循环

缺点:

  1. 循环会耗时
  2. 一次性只能保证一个共享变量的原子性
  3. ABA问题

CAS :ABA 问题
简单来说:线程A和线程B 都操作主存中同一资源时,如果主存中变量C 原为 1;被线程A改为2之后再次改为1,此时线程是无法判断变量C有无被其他线程修改过。

原文地址:https://www.cnblogs.com/blackBlog/p/13451596.html