java aba问题_关于java CAS相关的ABA问题总结

ABA本质是并发情况下使用cas修改数据,在都成功的情况下丢失一次修该信息,比如 A-C-D,A-B-C

ABA是否对程序造成影响是否需要解决?

1.如果只是单纯的数值数据,无业务关联逻辑,没有影响,比如Lock锁的实现就不考虑这个问题,因此如果只是单纯的技术或者统计请忽略aba问题

2.如果数据是有业务含义的就需要处理,尤其是资金问题

java里面的解决办法

1.操作同一个对象的时候,每次都通过new新对象进行包装(其实变相避免了两个A的出现),如下

public class ConcurrentStack {

AtomicReference top = new AtomicReference();

public void push(String item){

Node newTop = new Node(item);

Node oldTop;

do{

oldTop = top.get();

newTop.next = oldTop;

}

while(!top.compareAndSet(oldTop, newTop));

}

public String pop(){

Node newTop;

Node oldTop;

do{

oldTop = top.get();

if(oldTop == null){

return null;

}

newTop = oldTop.next;

}

while(!top.compareAndSet(oldTop, newTop));

return oldTop.item;

}

}

2.常规办法 使用 AtomicStampedReference  或者  AtomicMarkableReference

AtomicStampedReference可以知道,引用变量中途被更改了几次。有时候,我们并不关心引用变量更改了几次,只是单纯的关心是否更改过,所以就有了AtomicMarkableReference。AtomicMarkableReference的唯一区别就是不再用int标识引用,而是使用boolean变量——表示引用变量是否被更改过。构造函数

private static AtomicStampedReference atomicStampedRef = new AtomicStampedReference(100, 0);

atomicStampedRef.compareAndSet(100, 101, atomicStampedRef.getStamp(), atomicStampedRef.getStamp() + 1);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值