转载:并发-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会认为该变量没有被修改过,但是不会影响并发程序的正确性。