ABA问题:

假如有两个线程1,2;
cas下:1.线程取值完等待,2线程取值并把A改成B,有把B改成A,这是1线程执行会任务A还是原来的A没有发生改变,如果不在乎中间结果,只看收尾,那么没必要解决ABA问题

如何解决?

使用AtomicStampedRefererce,加版本号

代码演示如下:

package Volatile;import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;
import java.util.concurrent.atomic.AtomicStampedReference;/*** ABA问题的解决办法  AtomicStampedReference 时间戳原子引用·*/
public class ABA {static AtomicReference<Integer> atomicReference = new AtomicReference<>(100);static AtomicStampedReference<Integer> atomicStampedReference = new AtomicStampedReference<>(100,1);public static void main(String []args){System.out.println("==========以下是ABA问题的产生=======");new Thread(()->{atomicReference.compareAndSet(100,101);atomicReference.compareAndSet(101,100);},"t1").start();new Thread(()->{//暂停1秒t2线程,保证t1完成一次ABAtry {TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace();}System.out.println(atomicReference.compareAndSet(100,2019)+"\t"+atomicReference.get());},"t2").start();try {TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { e.printStackTrace();}System.out.println("=========以下是ABA问题的解决==========");new Thread(()->{int stamp = atomicStampedReference.getStamp();System.out.println(Thread.currentThread().getName()+"\t第一次版本号:"+atomicStampedReference.getStamp());//暂停1秒t3线程,让t4也获取到一样的stamptry {TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace();}atomicStampedReference.compareAndSet(100,101,atomicStampedReference.getStamp(),atomicStampedReference.getStamp()+1);System.out.println(Thread.currentThread().getName()+"\t第二次版本号:"+atomicStampedReference.getStamp());atomicStampedReference.compareAndSet(101,100,atomicStampedReference.getStamp(),atomicStampedReference.getStamp()+1);System.out.println(Thread.currentThread().getName()+"\t第三次版本号:"+atomicStampedReference.getStamp());},"t3").start();new Thread(()->{int stamp = atomicStampedReference.getStamp();System.out.println(Thread.currentThread().getName()+"\t第一次版本号:"+atomicStampedReference.getStamp());//暂停1秒t3线程try {TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace();}boolean result = atomicStampedReference.compareAndSet(100, 2019, stamp, stamp + 1);System.out.println(Thread.currentThread().getName()+"\t修改功否:"+result);System.out.println(Thread.currentThread().getName()+"\t当前实际最新值:"+atomicStampedReference.getReference());},"t4").start();}
}

cas引出的ABA问题?如何解决?- 理解原子引用、时间戳(版本号)原子引用相关推荐

  1. JUC04-- CAS自旋 、CAS自旋锁、ABA问题及解决办法、18大原子类

    文章目录 JUC04 课程任务概览 CAS CAS原理简介 CAS发展: CAS是什么? CAS原理: CAS优点: **CAS底层实现-引出Unsafe类** ==CAS自旋实现个人总结== Ato ...

  2. 18.AtomicReference、AtomicStampReference底层原理。多个变量更新怎么保证原子性?CAS的ABA问题怎么解决?

    老王:小陈啊,上一章我们说了AtomicInteger.AtomicBoolean的底层原理,这一篇我们就来说说Atomic系列的另一个分类AtomicReference和AtomicStampRef ...

  3. CAS详解及ABA问题的解决

    序言 由于最近项目上遇到了高并发问题,而自己对高并发,多线程这里的知识点相对薄弱,尤其是基础,所以想系统的学习一下,以后可能会出一系列的JUC文章及总结 ,同时也为企业级的高并发项目做好准备. 本文是 ...

  4. 真实业务场景展现CAS原理的ABA问题及解决方案

    文章目录 阅读提示 CAS原理.ABA问题介绍 真实业务场景 如何解决ABA问题 CAS学习总结 阅读提示 本文将借助开保险柜的业务场景重点阐述误用AtomicBoolean引起的ABA问题,以及解决 ...

  5. Java并发基石CAS原理以及ABA问题

    在学习CAS之前,先从一个简单的案例入手,进而引出CAS的基本使用: 1.基于CAS的网站计数器 需求: 我们开发一个网站,需要对访问量进行统计,用户每发送一次请求,访问量+1,如何实现? 我们模拟有 ...

  6. aba会导致问题_CAS导致的ABA问题及解决

    什么是CASCAS(Compare And Swap/Set)比较并交换,CAS算法的过程是这样:它包含3个参数CAS(V,E,N).V表示要更新的变量(内存值),E表示预期值(旧的),N表示新值.当 ...

  7. CAS中的ABA问题

    文章目录 1.什么是ABA问题 2.解决ABA问题 如果不理解CAS操作,可以看看我之前写的博客----CAS操作的基本原理 1.什么是ABA问题 CAS中的关键,就是先用内存中的值和旧的预期值进行比 ...

  8. CAS操作与ABA问题

    我们在使用锁时,线程获取锁是一种悲观锁策略,即假设每一次执行临界区代码都会产生冲突, 所以当前线程获取到锁的时候同时也会阻塞其他线程获取该锁.而CAS操作(又称为无锁操作)是一种乐观锁策略,它假设所有 ...

  9. CAS机制之ABA问题

    这篇博客主要讲解两个问题: 1,Java当中CAS底层实现 2,CAS的ABA问题和解决办法 Java当中CAS底层实现 首先我们来看JDK1.7的AtomicInteger类的incrementAn ...

最新文章

  1. android+ip+rule+策略路由,策略路由以及使用 ip route , ip rule , iptables 配置策略路由实例...
  2. 量子导航即将上路:实时更新,全局优化,不仅更快还能解决拥堵
  3. ITK:向索引添加偏移量
  4. 加拿大大学计算机排名2015,加拿大大学计算机排名
  5. Spire.Pdf 的各种操作总结
  6. wp_nav_menu($args)函数说明
  7. ROS入门-11.客户端Client的编程实现
  8. 网络带宽与实际上传下载速度之间关系
  9. Spring mvc 拦截器 配置心得
  10. android 切换主题介绍一
  11. COSCon’19开源教育论坛:开源无疆、教育无界
  12. 【谷歌重磅发布2017学术影响因子】AI、视觉、机器人TOP20 榜单
  13. linux系统live管理界面,5个你应该知道的Live Linux桌面发行版
  14. 关于BufferedOutputStream的flush方法
  15. 获取微信公众号素材的语言和视频
  16. 本周c++学习小结和心得
  17. MyBatis自定义自定义动态SQL解析方式
  18. Maix Bit K210识别色块(确定目标颜色)【保姆级教程】
  19. 小程序JS-处理英语单词,获取英语意思,注意事项
  20. 【SwiftUI模块】0018、SwiftUI搭建一个类似支付宝中的余额宝余额数字动画效果

热门文章

  1. PHP中的常用关键字
  2. LDA-Latent Dirichlet Allocation 学习笔记
  3. Oralce 9.2.0.6 到 9.2.0.8 升级 小结
  4. 【数据结构与算法】【字符串匹配】Trie树
  5. mysql数据库代码_【代码总结】MYSQL数据库的常见操作
  6. 基于探究式教学法的计算机网络原理课程的教学改革与实践,基于探究式教学法的“计算机网络原理”课程的教学改革与实践分析...
  7. html5 observer api,基于HTML5新特性Mutation Observer实现编辑器的撤销和回退操作
  8. oracle插入性能优化,Oracle-insert性能优化
  9. UE4 多人联机显示每个人的playid
  10. sqlite3 journal