文章 39
评论 43
浏览 115081
大白话之必会Java Atomic | 线程一点也不安全(二):Atomic的ABA问题会导致什么情况?如何解决?

大白话之必会Java Atomic | 线程一点也不安全(二):Atomic的ABA问题会导致什么情况?如何解决?

前言 第一章还没看过?点我可以穿越 阅读本篇文章,你需要了解以下知识: Atomic是什么?(点此跳转) 单向链表的原理 从上一章的内容,我们可以了解到,Atomic可以基本解决线程同步安全的问题。而本章我们将讨论Atomic的缺点与它的原子性。 ABA问题 什么是ABA问题?首先我们都知道,Atomic的CAS模型,会先读取变量的值,作为预期旧值,然后再基于旧值产生操作生成新值,再确认变量是否为预期旧值,如果是,修改为新值。 我们以单向链表来演示ABA会导致的问题: 解决ABA问题 现在我们知道了,由于Atomic仅判断了旧值,但并没有意识到整个链表已经被修改过一次了。所以我们要引入一个新的概念: 版本 Atomic在修改值时,保存的不仅再是旧值,还有一个版本号。在每次更改后,版本号都会变化,这样就不会再产生ABA问题了。我们看图: AtomicStampedReference Atomic的开发者自然也意识到了这个问题,并后续开发了AtomicStampedReference来修复这个问题。我们用一段简单的代码来实现: import java.util.concurrent....

大白话之必会Java Atomic | 线程一点也不安全(一):比自增和synchronized更快速、靠谱的原子操作(调用C语言)

大白话之必会Java Atomic | 线程一点也不安全(一):比自增和synchronized更快速、靠谱的原子操作(调用C语言)

前言 阅读本篇文章,你需要对下方知识有所了解: synchronized关键词的作用 线程池的作用(这里) 不靠谱和慢动作 在多线程环境下: 操作靠谱程度执行速度 i++ 自增运算没戏不赖 synchronized贼棒太废 不靠谱的自增 操作类 假如我们现在有一个变量:num 我们这个变量设置两个方法: 方法返回值作用 plus()void将num自增(+1) getNum()Integer返回num的值 代码如下: class Num { Integer num = 0; public void plus() { num++; } public Integer getNum() { return num; } } 主类 然后在另一个类主方法中新建一个缓存线程池: ExecutorService executorService = Executors.newCachedThreadPool(); 当我们执行executorService.execute(new Runnable() {})时,缓存线程池会将指定的对象以非阻塞的方式提交到队列中。 随后再写....

死钻技术 | 绝不抄袭