ABA问题怎么解:AtomicStampedReference和AtomicMarkableReference
本博客系列是学习并发编程过程中的记录总结。由于文章比较多,写的时间也比较散,所以我整理了个目录贴(传送门),方便查阅。
并发编程的基石——CAS机制这篇文章中介绍到CAS机制有一个缺点就是ABA问题:CAS在操作的时候会检查变量的值是否被更改过,如果没有则更新值,但是带来一个问题是:如果值最开始的值是A,接着变成B,最后又变成了A。经过检查这个值确实没有修改过,因此CAS机制会更新这个值。但是实际上这个值已经被修改过了。
AtomicStampedReference和AtomicMarkableReference就是用来解决CAS中的ABA问题的。他们解决ABA问题的原理类似,都是通过一个版本号来区分有没被更新过。
- AtomicStampedReference:带版本戳的原子引用类型,版本戳为int类型。
- AtomicMarkableReference:带版本戳的原子引用类型,版本戳为boolean类型。
AtomicStampedReference使用列子
public class AtomicStampedReferenceDemo {
private static Long var = new Long(1);
public static void main(String[] args) {
AtomicStampedReference<Long> referenceDemo = new AtomicStampedReference(var,1);
System.out.println("now value:"+referenceDemo.getReference().intValue());
int stamp = referenceDemo.getStamp();
System.out.println("now stamp:"+stamp);
boolean b = referenceDemo.compareAndSet(var, new Long(2), stamp, stamp + 1);
if(b){
System.out.println("success set value...");
System.out.println("now value:"+referenceDemo.getReference().intValue());
stamp = referenceDemo.getStamp();
System.out.println("now stamp:"+stamp);
}else {
System.out.println("failed set value...");
System.out.println("now value:"+referenceDemo.getReference().intValue());
stamp = referenceDemo.getStamp();
System.out.println("now stamp:"+stamp);
}
}
}
AtomicMarkableReference使用
关于AtomicMarkableReference的原理其实是与AtomicStampedReference类似的。
区别是AtomicMarkableReference的版本戳是boolean类型,所以导致版本状态只有两个:true或者false。
所以,我更倾向于称呼AtomicMarkableReference为带标记的原子引用类型。
- 版本戳 = true,表示此引用被标记。
- 版本戳 = false,表示此引用未被标记。
ABA问题怎么解:AtomicStampedReference和AtomicMarkableReference的更多相关文章
- 死磕 java并发包之AtomicStampedReference源码分析(ABA问题详解)
问题 (1)什么是ABA? (2)ABA的危害? (3)ABA的解决方法? (4)AtomicStampedReference是什么? (5)AtomicStampedReference是怎么解决AB ...
- AtomicReference,AtomicStampedReference与AtomicMarkableReference的区别
AtomicReference 通过volatile和Unsafe提供的CAS函数实现原子操作. 自旋+CAS的无锁操作保证共享变量的线程安全 value是volatile类型,这保证了:当某线程修改 ...
- CAS的ABA问题详解
CAS的ABA问题详解 ABA问题 在多线程场景下CAS会出现ABA问题,关于ABA问题这里简单科普下,例如有2个线程同时对同一个值(初始值为A)进行CAS操作,这三个线程如下 1.线程1,期望值为A ...
- AtomicStampedReference、AtomicMarkableReference 区别
AtomicMarkableReference 描述的是更加简单的是与否的关系,它的定义就是将数据变换为true 或 false,通常ABA问题只有两种状态,AtomicMarkableReferen ...
- AtomicReference、AtomicStampedReference 和 AtomicMarkableReference
这三个都是自 JDK1.5 开始加入到 java.util.concurrent.atomic 下面的.他们都可以在 lock-free 的情况下以原子的方式更新对象引用. 一.AtomicRefer ...
- CAS底层原理与ABA问题
CAS定义 CAS(Compare And Swap)是一种无锁算法.CAS算法是乐观锁的一种实现.CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B.当预期值A和内存值V相同时,将内存值V修 ...
- CAS和ABA问题
一.引言 ...
- java并发编程(十三)----(JUC原子类)引用类型介绍(CAS和ABA的介绍)
这一节我们将探讨引用类型原子类:AtomicReference, AtomicStampedRerence, AtomicMarkableReference.AtomicReference的使用非常简 ...
- 原子类的ABA问题
原子类AtomicInteger的ABA问题 连环套路 从AtomicInteger引出下面的问题 CAS -> Unsafe -> CAS底层思想 -> ABA -> 原子引 ...
随机推荐
- Python--day68--Django ORM常用字段、不常用的字段、自定义字段
ORM和数据库的对应关系: Django ORM 常用字段和参数 常用字段 AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建 ...
- pytorch 状态字典:state_dict 模型和参数保存
pytorch 中的 state_dict 是一个简单的python的字典对象,将每一层与它的对应参数建立映射关系.(如model的每一层的weights及偏置等等) (注意,只有那些参数可以训练的l ...
- uva 562 Dividing coins(01背包)
Dividing coins It's commonly known that the Dutch have invented copper-wire. Two Dutch men were f ...
- [转载] linux find 命令
转载自 http://www.jb51.net/os/RedHat/1307.html Linux下find命令在目录结构中搜索文件,并执行指定的操作. Linux下find命令提供了相当多的查找条件 ...
- 51nod1327 棋盘游戏
远古大坑 神仙DP状态设计题 https://blog.csdn.net/white_elephant/article/details/83592103 从行的角度入手,无论如何都要状压 每列最多放一 ...
- Django入门8--Templates过滤器
过滤器大大减少了开发的代码量
- window 系统下修改`CMD`的编码格式的方法,`CHCP` 的 使用
CHCP的使用 CHCP是一个计算机指令,能够显示或设置活动代码页编号. 一般上是在命令提示框中使用,用来查询和修改命令提示框的编码格式 具体使用方法 查看活动代码页编号 方式1: >>& ...
- 21个项目玩转深度学习:基于TensorFlow的实践详解01—MNIST机器学习入门
数据集 由Yann Le Cun建立,训练集55000,验证集5000,测试集10000,图片大小均为28*28 下载 # coding:utf-8 # 从tensorflow.examples.tu ...
- vuex 快速上手,具体使用方法总结(含使用例子)
网上有关vuex的文章很多,但有些比较复杂,这篇文章能让你快速使用vuex: vuex 用处:管理全局状态(类似全局变量,每个组件都能访问到) vuex 用法: //下面是一个js文件,用最简单最全的 ...
- H3C配置Hybrid端口