先来看一下什么是ABA问题:
若线程1第一次读取的值为A,线程1准备对A执行写操作,但这段时间,线程2完成了A->B->A的更改,当线程1准备写时,A已经不是原来的A了。

举例

一个单链表,T1和T2分别取出A

T1把A改成了ACD,此时A->next=C。

但T2不知道,当T2尝试把A换为B时,由于B->next是null(T1以为A->next也是null呢)替换后就会造成C、D处于游离状态。


那么,如何解决ABA问题呢?

JDK1.5以后,推出了两种办法解决或改善ABA问题。分别是:AtomicStampedRefence和AtomicMarkableReference

1、AtomicStampedRefence

观察其源码发现:其内部的value被pair代替,即:

private volatile Pair<V> pair;

pair源码:

private static class Pair<T> {final T reference;final int stamp;private Pair(T reference, int stamp) {this.reference = reference;this.stamp = stamp;}static <T> Pair<T> of(T reference, int stamp) {return new Pair<T>(reference, stamp);}
}

可以看到,其内部不仅有T引用模板,还有一个int类型的stamp作为版本号,等到修改的时候,比较当前版本号与当前线程持有的版本号是否一致,若一直,则修改,并stamp+1


2、AtomicMarkableReference

观察其源码发现:其内部的value被pair代替,即:

private volatile AtomicMarkableReference.Pair<V> pair;

pair源码:

static <T> AtomicMarkableReference.Pair<T> of(T var0, boolean var1) {return new AtomicMarkableReference.Pair(var0, var1);
}

可以看到,其内部不仅有T引用模板,还有一个boolean类型的var1.

var1的值有两个,true & false,修改的时候在这两个版本号之间来回切换,这样做并不能解决ABA问题,但可以降低其发生的几率


      ——朝着一个目标不断做精深练习,不断犯错,不断挑战自己的极限,这种你给你带来的收获绝对超出你的想象。

面试官问我:如何解决ABA问题?我给出接近满分的回答相关推荐

  1. 面试官问我 “String 的不可变真的是因为 final 吗“,我回答 “是“ 然后就被挂了。。。。。。

    String 为啥不可变?因为 String 中的 char 数组被 final 修饰.这套回答相信各位已经背烂了,But 这并不正确! 面试官:讲讲 String.StringBuilder.Str ...

  2. 面试官问你如何解决web高并发这样回答就好了

    所谓高并发,就是同一时间有很多流量(通常指用户)访问程序的接口.页面及其他资源,解决高并发就是当流量峰值到来时保证程序的稳定性.如何做到高并发优化 我们一般用QPS(每秒查询数,又叫每秒请求数)来衡量 ...

  3. 阿里面试官问我:如何设计秒杀系统?我给出接近满分的回答

    你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图和个人联系方式,欢迎Star和指教 正文 首先 ...

  4. 大厂面试官问你这些面试题你答的出吗?(附答案)

    1.问:你在测试中发现了一个bug,但是开发经理认为这不是一个bug,你应该怎样解决? 首先,将问题提交到缺陷管理库里面进行备案. 然后,要获取判断的依据和标准: 根据需求说明书.产品说明.设计文档等 ...

  5. 生命周期 用户可以操作dom_当面试官问:能否介绍下Vue生命周期时,该如何回答...

    上一篇文章中我们讲到了Vue框架的概念以及选用Vue的优劣势.本篇文章将就Vue进行进一步介绍-Vue生命周期. 首先每个 Vue 应用都是通过用 Vue 函数创建一个新的 Vue 实例开始的(受MV ...

  6. 岗位po是什么意思_面试时,面试官问你有什么优点和缺点?应该如何巧妙的回答?...

    工作多年,被面试过很多次,也面试过很多人,其中有一次印象最深刻,这次我不是主面试官,经理要面试一个候选人,他就拉上了我,作为陪衬,用经理的话说就是撑撑场面, 所以问题的主要是我们经理. 当问到一个问题 ...

  7. 面试阿里!妹子终面,阿里面试官问:有没有男朋友? 结果...

    点击"开发者技术前线",选择"星标????" 在看|星标|留言,  真爱 作者:  前线小熙  | 责编: 可可   来源 :开发者技术前线  刚好要到端午节前 ...

  8. 面试官问你想找什么工作_找工作时如何面试面试官

    面试官问你想找什么工作 在技​​术面试中要问的十二个问题 (Twelve questions to ask at tech interviews) I've just come off six wee ...

  9. 面试官问:Kafka 会不会丢消息?怎么处理的?

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! Kafka存在丢消息的问题,消息丢失会发生在Broker, ...

最新文章

  1. GitHUb 代码提交遇到的问题以及解决办法
  2. 使用Powershell将PST导入Exchange 2007
  3. 爬虫:通过滑动或者点触验证码的方法及实现(点触+滑动)
  4. Ajax请求SSM后台传值方式踩坑
  5. 通过hibernate去调用存储过程
  6. CodeForces - 427D Match Catch(后缀数组/广义后缀自动机)
  7. elasticsearch 的滚动(scroll)
  8. Kenai.com 将与 java.net 合并
  9. Node.js ES6 模块化的基本语法-按需导出与按需导入
  10. 大神干货:算法高手郭大顶级经验分享助你轻松通过初赛!
  11. VS工程,换电脑后出现的问题
  12. python异步调用shell_Jenkins pipeline中优雅的执行shell/python/groovy脚本
  13. Android企业级项目实战——基础篇(系列文章)
  14. 魔兽地图编辑器--人物自定义语音的方法和进入游戏自定义语音不能播放的问题
  15. Pytest的基本使用
  16. Ti 官方文档阅读笔记
  17. 2018/09/27Web前端学习第三课
  18. 网络协议篇之DHCP协议(一)—— DHCP协议基础
  19. 钢管热处理市场现状研究分析-
  20. 手把手教你学51单片机-变量进阶与点阵LED

热门文章

  1. Windows中非常实用的命令
  2. 深度好文:Netflix奈飞微服务架构设计解析
  3. [一]RabbitMQ-客户端源码之ConnectionFactory
  4. IO多路转接之poll
  5. 音视频技术开发周刊 | 187
  6. CES 2021线上大会前瞻、Roblox 估值近300亿美元、联想将推出企业级 AR 眼镜等|Decode the Week...
  7. GC之7大垃圾收集器详解(上)
  8. Valgrind 安装与使用
  9. 推荐一款好用的android反编译工具
  10. Spark _29_SparkStreaming初始