CAS :compare and swap非阻塞同步算法
2016-04-20 15:32
459 查看
CAS(乐观锁算法)
compare and swap,解决多线程并行情况下使用锁造成性能损耗的一种机制,CAS操作包含三个操作数——内存位置(V)、预期原值(A)和新值(B)。如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值do{ 备份旧数据; 基于旧数据构造新数据; }while(!CAS( 内存地址,备份的旧数据,新数据 ))
就是指当两者进行比较时,如果相等,则证明共享数据没有被修改,替换成新值,然后继续往下运行;如果不相等,说明共享数据已经被修改,放弃已经所做的操作,然后重新执行刚才的操作。容易看出 CAS 操作是基于共享数据不会被修改的假设,采用了类似于数据库的 commit-retry 的模式。当同步冲突出现的机会很少时,这种假设能带来较大的性能提升。
public class AtomicInteger extends Number implements java.io.Serializable { private static final long serialVersionUID = 6214790243416807050L; // setup to use Unsafe.compareAndSwapInt for updates private static final Unsafe unsafe = Unsafe.getUnsafe(); private static final long valueOffset; static { try { valueOffset = unsafe.objectFieldOffset (AtomicInteger.class.getDeclaredField("value")); } catch (Exception ex) { throw new Error(ex); } } private volatile int value; ,,,
+1操作
//+1操作 public final long getAndIncrement() { while (true) { long current = get(); long next = current + 1; //当+1操作成功的时候直接返回,退出此循环 //如果当前位置的值为current,更新为next if (compareAndSet(current, next)) return current; } }
相关文章推荐
- Unity3D 学习日记(四)生成不重复的随机数
- 用Matlab把散点拟合成曲面图
- 网络运营商名称显示&SIM名称显示
- Android Dagger依赖注入框架浅析
- .Net分布式架构(一):Nginx实现负载均衡
- listview 点击 item 字体变颜色
- 设计模式之单例模式
- PID38 串的记数(codevs2077)
- 77. Combinations
- BeagleBoneBlack学习之串口通信
- C语言05指针基础
- WMI技术介绍和应用——WMI概述
- JDK1.8源码学习之 HashMap.java
- C#集合类
- Android LayoutInflater原理分析,带你一步步深入了解View(一)
- sublime text 3注册码
- C#集合类
- [改善Java代码]养成良好习惯,显式声明UID
- Obtaining the event object
- 张小龙申论的写法总结