为什么要CAS?
1、synchronzied 太重,需要切换上下文,开销大
2、线程会刮起,被阻塞
3、voliate 不能保证原子性
CAS作用基于哪里?
基于JVM,操作硬件。
原理:
乐观锁的一种。
(V,A,B)
V:旧值
A:当前读取到的值,必须V==A才行
B:新值
CAS的问题:
1、ABA问题:
解决:加版本,AtomicStampedReference 这个类,版本是时间戳。有个数组做标记【引用,标记】
2、原子性:只能保障一个变量
将多个变量合成一个变量
3、自旋开销大
好处
voliate+CAS 就是AQS的核心
首先,声明共享变量为volatile;
然后,使用CAS的原子条件更新来实现线程之间的同步;
同时,配合以volatile的读/写和CAS所具有的volatile读和写的内存语义来实现线程之间的通信。