加入收藏 | 设为首页 | 会员中心 | 我要投稿 拼字网 - 核心网 (https://www.hexinwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 编程要点 > 语言 > 正文

什么是ABA 问题?Java里面的原生解决计划是什么?

发布时间:2022-12-05 12:40:43 所属栏目:语言 来源:
导读:  ABA问题是CAS机制中出现的一个问题,他的描述是这样的。我们直接画一张图来演示,

  什么意思呢?就是说一个线程把数据A变为了B,然后又重新变成了A。此时另外一个线程读取的时候,发现A没有变化,就误以

  ABA问题是CAS机制中出现的一个问题,他的描述是这样的。我们直接画一张图来演示,
 
  什么意思呢?就是说一个线程把数据A变为了B,然后又重新变成了A。此时另外一个线程读取的时候,发现A没有变化,就误以为是原来的那个A。这就是有名的ABA问题。ABA问题会带来什么后果呢?我们举个例子。
 
  一个小偷,把别人家的钱偷了之后又还了回来,还是原来的钱吗,ABA问题也一样,如果不好好解决就会带来大量的问题。最常见的就是资金问题,也就是别人如果挪用了你的钱,在你发现之前又还了回来。但是别人却已经触犯了法律。
 
  如何去解决这个ABA问题呢,就是使用今天所说的AtomicStampedReference。
 
  二、AtomicStampedReference
 
  1、问题解决
 
  我们先给出一个ABA的例子,对ABA问题进行场景重现。
 
  public class AtomicTest {
 
   private static AtomicInteger index = new AtomicInteger(10);
 
   public static void main(String[] args) {
 
    new Thread(() -> {
 
     index.compareAndSet(10, 11);
 
     index.compareAndSet(11, 10);
 
     System.out.println(Thread.currentThread().getName()+
 
       ":10->11->10");
 
    },"张三").start();
 
     
 
    new Thread(() -> {
 
     try {
 
      TimeUnit.SECONDS.sleep(2);
 
      boolean isSuccess = index.compareAndSet(10, 12);
 
      System.out.println(Thread.currentThread().getName()+
 
        ":index是预期的10嘛,"+isSuccess
 
        +"   设置的新值是:"+index.get());
 
     } catch (InterruptedException e) {
 
      e.printStackTrace();
 
     }
 
    },"李四").start();
 
   }
 
  }
 
  在上面的代码中,我们使用张三线程,对index10->11->10的变化,然后李四线程读取index观察是否有变化,并设置新值。
 

(编辑:拼字网 - 核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!