关于CAS
CAS是乐观锁的一种实现。CAS是Compare And Swap的缩写,是一种高效的处理并发的机制,说他高效是因为CAS是cpu的一个指令,可以在指令层面上来进行操作(非CPU指令操作需要多个CPU指令组合才能够完成功能,所以效率有影响);至于并发处理,是因为CAS操作首先是一个原子操作(CPU指令已经确立了原子地位),其次CAS有三个参数:V,E,N,首先Compare一下,变量V的值是否和E相同,如果相同则更新为值N,如果不相同则需要重新获取,做逻辑判断再更新。
首先我们讲一下乐观锁,乐观锁是一种“读多写少”场景的假设。所以会有ABA的问题,比如有两个线程:线程1,线程2;线程1讲数据(原始为A)改为B,后来又改为A;线程2读取发现是A,就认为数据并没有修改,继续对数据进行修改为B。
乐观锁/ 悲观锁在技术层面的实现为:
数据库:乐观锁, verseion字段判断;悲观锁,select ...for update;
JVM:乐观锁,CAS;悲观锁:sync/reentrylock;
CAS在Java中具体应用就是原子类,比如AtomicInteger里面的“getAndAccumulate"函数,就是通过轮训的方式来尝试修改;这个也说明了CAS主要用于读多写少的场景,因为如果大量的并发修改将会导致CAS的多次轮训
参考: