1、cas 是机器里面那个关键字
unsafe c++ 写的 comxchg
2、cas java 的实现
atomic 包下
3、是什么锁
乐观锁
4、aba 问题解决
CAS可以有效的提升并发的效率,但同时也会引入ABA问题。
如线程1从内存X中取出A,这时候另一个线程2也从内存X中取出A,并且线程2进行了一些操作将内存X中的值变成了B,然后线程2又将内存X中的数据变成A,这时候线程1进行CAS操作发现内存X中仍然是A,然后线程1操作成功。虽然线程1的CAS操作成功,但是整个过程就是有问题的。比如链表的头在变化了两次后恢复了原值,但是不代表链表就没有变化。
所以JAVA中提供了AtomicStampedReference/AtomicMarkableReference来处理会发生ABA问题的场景,主要是在对象中额外再增加一个标记来标识对象是否有过变更。
5、AtomicStampedReference与AtomicReference的区别:
AtomicStampedReference它内部不仅维护了对象值,还维护了一个时间戳(我这里把它称为时间戳,实际上它可以使任何一个整数,它使用整数来表示状态值)。当AtomicStampedReference对应的数值被修改时,除了更新数据本身外,还必须要更新时间戳。当AtomicStampedReference设置对象值时,对象值以及时间戳都必须满足期望值,写入才会成功。因此,即使对象值被反复读写,写回原值,只要时间戳发生变化,就能防止不恰当的写入。
6、AtomicStampedReference实现
方法体会取得 stamp 版本号
7、AtomicStampedReference 和 AtomicMarkableReference 的区别
AtomicStampedReference 版本号
AtomicMarkableReference 是否 用法没有AtomicStampedReference灵活。因此也只是在特定的场景下使用。
布尔 pair = Pair.of(initialRef, initialMark);