并发-CAS原则

来源:互联网 发布:linux 安装 wine 编辑:程序博客网 时间:2024/06/05 04:07

转载:http://www.cnblogs.com/xrq730/p/4976007.html
http://www.cnblogs.com/bigdatafly/p/5002604.html

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

0 0
原创粉丝点击