CAS原理

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);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值