1.概念:
CAS是英文单词Compare and Swap的缩写,翻译过来就是比较并替换。即,
CAS机制中使用了3个基本操作数:内存地址V,旧的预期值A,要修改的新值B。
更新一个变量的时候,只有当变量的预期值A和内存地址V当中的实际值相同时,才会将内存地址V对应的值修改为B。
2.AtomicInteger源码分析
拿出一段代码来说,传入期望值和更新的值,调用unsafe的CAS方法,(unsafe类手动管理内存,一般不用)。
public final boolean compareAndSet(int expect, int update) { //第二个成员变量是valueOffset,它是共享变量value在AtomicInteger对象上的内存偏移量。它作为compareAndSwapInt的第二个参数,用于 //修改共享变量value的值。 return unsafe.compareAndSwapInt(this, valueOffset, expect, update); }
3.ABA问题以及解决方式
接下来先讲一下什么是ABA问题?当我们将共享变量value的值改变为之前一样的,这样下一个人在进行比对的时候,发现值并没有改变,其实我们之前已经对值进行了一次改变。比如链表的头在变化了两次后恢复了原值,但是不代表链表就没有变化。
解决办法
进行添加版本号。
AtomicMarkableReference源码分析
//构造函数,将指定的引用值和标记值构造一个pair对象,并将这个pair对象赋值给成员变量pair,由于成员变量是volatile修饰 //的,并且这里是一个单操作的赋值语句,可以保证原子性。
public
AtomicMarkableReference(V initialRef,
int
initialMark) {
pair = Pair.of(initialRef, initialMark);
}
//只要引用值和标记值,有一个是不一样的,就修改引用值和标记值
public
void
set(V newReference,
int
newMark) {
Pair<V> current = pair;
if
(newReference != current.reference || newMark != current.mark)
this
.pair = Pair.of(newReference, newMark);
}