并发-CAS原则

转载:并发-CAS原则

1.java内存模型图:


java内存模型图

每个线程单独有一份来自内存的变量拷贝,彼此之间的操作是不可见的。一般情况下,都是在缓存中读取它们所用到的数据,不会跨越而直接从内存读取,因此,就产生在多线程情况下要注意并发控制。

2.CAS
CAS(compare and swap),中文为:比较并交换,是并发控制操作的基础。
CAS有三个值:内存值、原始值、修改值,如果原始值不等于内存值,返回false;如果等于则修改,返回true,并将内存值修改为修改值。
CAS是乐观锁用到的主要机制,乐观锁是不用加锁去执行操作,如果产生冲突则失败重试,直到成功为止,也叫做“自旋”。
与乐观锁相对应的是悲观锁,synchronized就是悲观锁,也叫“独占锁”需要加锁进行操作,并且加锁代码块中的只能有一个线程进行操作。

接下来我们来看看java.util.concurrent下AtomicInteger源码

 // setup to use Unsafe.compareAndSwapInt for updates
 private static final Unsafe unsafe = Unsafe.getUnsafe();
 private static final long valueOffset;
 public final boolean compareAndSet(int expect, int update) {
        return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
 }
 /**
 * Atomically increments by one the current value.
 * @return the updated value
 */
 public final int incrementAndGet() {
    return unsafe.getAndAddInt(this, valueOffset, 1) + 1;
 }

Unsafe类提供了硬件级别的原子操作,该类里面大部分都是native方法,从而使java间接访问到操作系统底层
CAS缺点:经典问题“ABA”问题,就是说,如果一个变量值为A,然后被修改成B,在修改成A,CAS会认为该变量没有被修改过,但是不会影响并发程序的正确性。

你可能感兴趣的:(并发-CAS原则)