java的cas aba问题_解决CAS的ABA问题

解决CAS的ABA问题

AtomicStampedReference

一个值reference和时间戳stamp组成一个pair,每次cas的时候是cas一个pair

public AtomicStampedReference(V initialRef, int initialStamp) {

pair = Pair.of(initialRef, initialStamp);

}

//比较设置 参数依次为:期望值 写入新值 期望时间戳 新时间戳

public boolean compareAndSet(V expectedReference, V newReference,

int expectedStamp, int newStamp)

@Test

public void Atomic() {

AtomicStampedReference asf = new AtomicStampedReference(10,0);

System.out.println("本次refernce:"+asf.getReference()+",本次stamp:"+asf.getStamp());

asf.compareAndSet(10, 11, 0, asf.getStamp()+1);

System.out.println("本次refernce:"+asf.getReference()+",本次stamp:"+asf.getStamp());

asf.compareAndSet(11, 10, asf.getStamp(), asf.getStamp()+1);

System.out.println("本次refernce:"+asf.getReference()+",本次stamp:"+asf.getStamp());

asf.compareAndSet(10, 11, 0, asf.getStamp()+1);

System.out.println("本次refernce:"+asf.getReference()+",本次stamp:"+asf.getStamp());

}

本次refernce:10,本次stamp:0

本次refernce:11,本次stamp:1

本次refernce:10,本次stamp:2

本次refernce:10,本次stamp:2

AtomicMarkableReference

一个pair是一个reference和一个mark,这个mark标志有没有修改过

private Pair(T reference, boolean mark) {

this.reference = reference;

this.mark = mark;

}

AtomicMarkableReference asf = new AtomicMarkableReference(10,false);

System.out.println("本次refernce:"+asf.getReference()+",本次Mark:"+asf.isMarked());

asf.compareAndSet(10, 11, false, true);

System.out.println("本次refernce:"+asf.getReference()+",本次Mark:"+asf.isMarked());

asf.compareAndSet(11, 10, false, true);

System.out.println("本次refernce:"+asf.getReference()+",本次Mark:"+asf.isMarked());

//要修改的时候如果要求是未修改的,那么只有一个能改成功

本次refernce:10,本次Mark:false

本次refernce:11,本次Mark:true

本次refernce:11,本次Mark:true

哪些地方用到了CAS

原子类、锁

JUC.atomic

JUC.lock

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值