与锁相比,使用比较交换(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以后,虚拟机便可以使用这个指令来实现并发操作和并发数据结构,并且,这种操作在虚拟机中可说是无处不在。