标签: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的原子性来实现线程之间的通信
标签:exp err 无锁 col 通信 一个 机制 current new
原文地址:https://www.cnblogs.com/yangyongjie/p/10654084.html