《并发编程》--20.无锁的并发策略(比较交换 CAS)
2017-09-27 10:56
183 查看
与锁相比,使用比较交换(CAS)会使程序看起来更加复杂一些,但由于其非阻塞性,他对死锁天生免疫,并且,线程间的相互影响也远远比基于锁的方式要小。更为重要的是,使用无锁的方式完全没有锁竞争带来的系统开销,也没有线程间频繁调度带来的开销,因此,他要比基于锁的方式拥有更优越的性能。
CAS算法的过程是这样:他包含三个参数CAS(V,E,N)。V表示要更新的变量,E表示预期值,N表示新值。当V值等于E值值,才会将V值设为N值,如果V值和E值不同,则说明已经有其他线程做了更新,则当前线程什么事都不做。最后,CAS会返回当前V的真实值。CAS操作是抱着乐观的态度进行的,他总认识自己可能成功的完成操作。当多个线程同时使用CAS操作一个表示时,只有一个会胜出,并且更新成功,其他都会更新失败。失败的线程不会挂起。仅是被告知失败,并且允许再次尝试,当前页允许失败的线程放弃操作。
基于这个的原理,CAS操作及时没有锁,也可以发现其他线程对当前线程的干扰,并进行恰当的处理
简单的说,CAS需要程序员额外给出一个期望值,也就是程序员认为这个变量应该是什么样子的。如果变量不是你理想的状态,那就说明他已经被其他的线程修改了,程序员就需要重新读取,再次尝试修改
在硬件层面,大部分的现代处理器都已经支持原子化的CAS指令,在JDK1.5以后,虚拟机便可以使用这个指令来实现并发操作和并发数据结构,并且,这种操作在虚拟机中可说是无处不在。
CAS算法的过程是这样:他包含三个参数CAS(V,E,N)。V表示要更新的变量,E表示预期值,N表示新值。当V值等于E值值,才会将V值设为N值,如果V值和E值不同,则说明已经有其他线程做了更新,则当前线程什么事都不做。最后,CAS会返回当前V的真实值。CAS操作是抱着乐观的态度进行的,他总认识自己可能成功的完成操作。当多个线程同时使用CAS操作一个表示时,只有一个会胜出,并且更新成功,其他都会更新失败。失败的线程不会挂起。仅是被告知失败,并且允许再次尝试,当前页允许失败的线程放弃操作。
基于这个的原理,CAS操作及时没有锁,也可以发现其他线程对当前线程的干扰,并进行恰当的处理
简单的说,CAS需要程序员额外给出一个期望值,也就是程序员认为这个变量应该是什么样子的。如果变量不是你理想的状态,那就说明他已经被其他的线程修改了,程序员就需要重新读取,再次尝试修改
在硬件层面,大部分的现代处理器都已经支持原子化的CAS指令,在JDK1.5以后,虚拟机便可以使用这个指令来实现并发操作和并发数据结构,并且,这种操作在虚拟机中可说是无处不在。
相关文章推荐
- CAS-比较&交换并发处理策略
- 7-6 冒泡法排序(20 分) 将N个整数按从小到大排序的冒泡排序法是这样工作的:从头到尾比较相邻两个元素,如果前面的元素大于其紧随的后面元素,则交换它们。通过一遍扫描,则最后一个元素必定是最大的元素
- 对于Synchronized、ReentrantLock、Atomic、CAS在并发下面的性能比较测试
- (转)乐观的并发策略——基于CAS的自旋
- 乐观的并发策略——基于CAS的自旋
- java线程--无锁CAS(CompareAndSet比较交换)
- 乐观的并发策略——基于CAS的自旋
- 乐观的并发策略——基于CAS的自旋
- 乐观的并发策略——基于CAS的自旋
- 乐观的并发策略——基于CAS的自旋
- VSAN 第 20 部分 – 虚拟机交换和虚拟机存储策略
- java并发之CAS操作
- java并发:线程池、饱和策略、定制、扩展
- 设计模式:状态模式和策略模式的比较blogdown的专栏
- 并发自定义主键生成策略
- 数据插入一种基于CAS的无锁并发HashTable设计及C代码实现
- 大型高并发高负载web应用系统架构-数据库架构策略
- 经济学的思维方式读书笔记:第二章 效率,交换与比较优势
- a,b交换与比较
- cas入门之二十四:ticket的过期策略