关于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的多次轮训

 

参考:

https://juejin.im/post/5a803e61f265da4e914b5b63

https://www.zhihu.com/question/23284469

posted on 2019-05-17 17:45  下士闻道  阅读(237)  评论(0编辑  收藏  举报

导航