CAS是种思想,比较和交换,用于并发度不高的场景,因为大部分情况下没有竞争,或者竞争不大,直接用synchronized会设计上下文切换,时间片轮转,2w个时间单位,所以我们不妨让线程做下自旋,以稍许的cpu的代价去抵消这部分的消耗.
CAS 有 比较和交换的意思,当前处理器基本上都支持CAS操作,只不过各家实现的算法不一样罢了。
其包含三个步骤:一个内存地址V , 期望值A和新值B.
操作的时候如果是A,那么就将内存地址的值指向B.
CAS不适合竞争大的场景.
Screen Shot 2022-04-04 at 11.01.07 PM.png
CAS实现的ABA问题:
-
劣势:
只能针对一个共享变量才能执行该操作,如果是多个就无法执行。 -
Atomic的实现
public final boolean compareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}
- CAS的第二个问题
ABA, 无法知道途中可能有的更改,需要带上版本号去记录过程的变更.
-
底层支持是unsafe类
unsafe的实现由hotspot虚拟机对其进行支持.
Screen Shot 2022-04-04 at 11.10.34 PM.png
所以cas是硬件层面的指令.
- AtomicStampReference 也提供了相应的支持. 可以记录每一次的版本号,在构造函数中指定.
Screen Shot 2022-04-04 at 11.12.25 PM.png
网友评论