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 -> 原子引 ...
随机推荐
- 用diiv实现多个方块居中嵌套--padding
文章地址 https://www.cnblogs.com/sandraryan/ 案例:用diiv嵌套多个正方形,配合盒模型相关知识,使每个div在他的父元素上居中.(每个div中心点对齐) 涉及到m ...
- springboot 2.1.6.RELEASE pom 第一行报错
eclipse创建springboot 2.1.6.RELEASE pom第一行报错 在pom.xml 文件的properties中加入maven jar插件的版本号 <maven-jar-p ...
- Python--day23--初识面向对象复习
面向对象编程是大程序编程思想:
- vector容器、
一. vector 向量容器1. 创建 vector 对象(1)不指定容器大小vector<int> V;(2)指定容器大小vector<int> V(10);(3) ...
- js将单个反斜杠转化为斜杠的问题
var two="https://192.255.255.255:3215/2019/2/26/16/13/b2e8929483c66cefddbe1e49a007e3f8-47358FC3 ...
- 《代码整洁之道 中文版》高清 PDF 电子书下载
代码整洁之道.PDF 下载 代码整洁之道.PDF 中文版 高清 PDF 电子书下载 代码整洁之道下载 点我下载 作者简介 · · · · · · Robert C. Martin,Object ...
- linux scull 中的设备注册
在内部, scull 使用一个 struct scull_dev 类型的结构表示每个设备. 这个结构定义为: struct scull_dev { struct scull_qset *data; ...
- P1002 Hello,World!
题目描述 输出"Hello Wolrd!". 输入格式 无. 输出格式 输出一行"Hello World!". 样例输入 无. 样例输出 Hello World ...
- 【js】vue 2.5.1 源码学习(二) 策略合并
一. 整体思路 1 首先是代码的大体构造,先判断引入代码的环境,即对应amd 和cmd的处理 2 vue_init 需要借助 initMinxin ==>>> ...
- 圆角效果 border-radius——阴影 box-shadow——为边框应用图片 border-image
1.圆角效果 border-radius border-radius: 5px 4px 3px 2px; /* 四个半径值分别是左上角.右上角.右下角和左下角,顺时针 */ 不要以为border-ra ...