目录
什么是CAS
CAS意为比较和交换。我们先举个小例子。我们在volatile中为了保证了操作的原子性,当时引入了AtomicInteger类。使用Atomic类中的方法的底层原理就CAS。
下面这个小例子,CAS在Java中的代码中比较给定值是否符合期望值,符合就更新,不符合就不更新
点进AtomicInteger源码,发现里面有unsafe。那什么是unsafe呢?unsafe是java调用C++的native方法操作内存的标志。
我们再点进getAndIncrement方法,发现它底层调用了getAndAddInt
进入getAndAddInt才发现,这里用了一个自旋锁。原来比较和交换的逻辑写在这里。比较的是内存地址偏移的值
CAS的工作原理
CAS比较工作内存中的值与主内存的值, 如果这个值是期望的,就执行操作。如果不是就一直循环下去。(自旋锁)
CAS的优缺点
优点:
1.直接操作内存,效率非常高。
2.保证了操作的原子性
缺点:
1.循环会耗费时间
2.一次性只能保证一个共享变量的原子性
3.会出现ABA问题
什么是ABA问题
简单来说就是有一个捣乱的线程,虽然最后写的值一样,但是两个线程从主线程那里操作的数据不一致。
我们期望的是,只要主线程的值变了就要通知其他线程,因为这种打印结果并不是真正的执行流程
解决此问题需要加上乐观锁操作,通过版本判断是否操作同一个主存的值