CAS:
- CompareAndSwap(比较并交换)
- 他是一条CPU原语,原语的执行是连续的,不允许被中断
- 调用的Unsafe.class 下的原生方法
该方法传入对象,内存偏移量与增加值
通过对象与内存偏移量得到期望值,因为是Volatile修饰,所以如果有其他线程修改,那么也是能读取主内存的值
weakCompareAndSetInt (该方法具有原子性)重新获取内存值与期望值比较,如果通过,进行增加操作并返回值
倘若失败,重新读取内存值,并判断
- 该技术的意思是:线程在本地内存修改变量,并刷新到主内存的时候,本地内存原本拷贝的变量值(期望值)会与主内存的变量值比较,如果不相同,则无法将修改的值刷新回主内存。类似于乐观锁
CAS的缺点:
- 由于存在循环,可能存在一直循环状态,所以对CPU的开销很大。
- 只能保证一个共享变量的原子问题。
- 可能出现ABA问题。
ABA:
ABA的意思即为,当A和B同时拷贝主内存的值A,然后B在自己的本地内存将A修改成B,并写回给主内存,紧接着B又读取主内存的值,并在自己的本地内存将B修改成A,写回主内存。此时主内存的值变化为ABA,而对于A线程而言,并不知道内存已经有ABA变动,仍然将自己修改的值写回主内存。