码迷,mamicode.com
首页 > 其他好文 > 详细

CAS

时间:2019-04-04 12:53:55      阅读:177      评论:0      收藏:0      [点我收藏+]

标签:exp   err   无锁   col   通信   一个   机制   current   new   

最近在看 java.util.concurrent.atomic 包下的AtomicInteger源码发现它是利用CAS来实现原子操作、Volatile保证元素的可见性来实现无锁下的线程安全。  决定深入了解一下CAS
MySql中的MVCC(多并发版本控制)中的乐观锁也是通过CAS机制和版本号实现无锁更新数据的
CAS Campare And Swap 比较和交换
CAS(V,E,N) 的三个参数
V 要修改的对象(有的说是内存位置)
E  expect 期望原值
N  new 要修改为的新值

1、获取要修改的变量的现有值
2、和期望值比较,是否相同
3、相同的话则将变量的值修改为新值。不相同则不修改,返回修改是否成功。

CAS存在的问题 ABA问题
ABA:例如两个线程同时更新同一个数据,线程1操作比较快,先把A修改为了B,然后再修改为了A;
线程2读取到线程1两次修改后的值A和之前的期望值A比较,相同,则认为没有被修改过符合期望,接着修改为新值。
解决方案是引入版本的概念:如A1-B2-A3,这样,另一个线程读取到的A3和期望值A1虽然值相同但是版本不同,则不进行后续的操作。
AtomicInteger中的valueOffset就是解决ABA问题的,这个具体为什么,我还没看懂,
private static final long valueOffset;

    static {
        try {
            valueOffset = unsafe.objectFieldOffset
                (AtomicInteger.class.getDeclaredField("value"));
        } catch (Exception ex) { throw new Error(ex); }
    }


concurrent包下的类都有下面的实现模式
1、首先,声明变量为volatile
2、然后,使用CAS的原子条件更新来实现线程之间的同步
3、配合使用volatile的写可见性和CAS的原子性来实现线程之间的通信

CAS

标签:exp   err   无锁   col   通信   一个   机制   current   new   

原文地址:https://www.cnblogs.com/yangyongjie/p/10654084.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!