AtomicStampedReference AtomicReference解决CAS机制中ABA问题

AtomicStampedReference

AtomicStampedReference它内部不仅维护了对象值,还维护了一个版本号(可以是任何一个整数,它使用整数来表示状态值)。当AtomicStampedReference对应的数值被修改时,除了更新数据本身外,还必须要更新版本号。因此只要版本号发生变化,就能防止不恰当的写入。版本号类似于时间戳。

import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicStampedReference; public class Test {
/**
**/ public static void main(String[] args) {
AtomicInteger integer = new AtomicInteger(0);
AtomicStampedReference<Integer> reference = new AtomicStampedReference<>(100,1000);
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
integer.compareAndSet(0,1);
integer.compareAndSet(1,0);
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.currentThread().sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
boolean b = integer.compareAndSet(0, 1);
System.out.println("AtomicInteger替换");
if(b) System.out.println("0已经被替换为1");
else System.out.println("替换失败");
}
});
Thread t3 = new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.currentThread().sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
reference.compareAndSet(100,-100,
reference.getStamp(), reference.getStamp()+1);
reference.compareAndSet(-100,100,
reference.getStamp(), reference.getStamp()+1);
}
});
Thread t4 = new Thread(new Runnable() {
@Override
public void run() {
int stamp = reference.getStamp();
try {
Thread.currentThread().sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
boolean b = reference.compareAndSet(100, -100,
stamp, reference.getStamp() + 1);
System.out.println("AtomicStampedReference替换");
if(b) System.out.println("100已经被替换为-100");
else System.out.println("替换失败");
}
});
t1.start();
t2.start();
t3.start();
t4.start();
}
}
输出结果:
AtomicInteger替换
0已经被替换为1
AtomicStampedReference替换
替换失败

AtomicReference

AtomicReference类提供了一个可以原子读写的对象引用变量。 原子意味着尝试更改相同AtomicReference的多个线程(例如,使用比较和交换操作)不会使AtomicReference最终达到不一致的状态。

import java.util.concurrent.atomic.AtomicReference;

public class ABAObjectTest {
public static void main(String[] args) {
SubObject subObject = new SubObject(100,"一百");
AtomicReference<SubObject> reference = new AtomicReference<>(subObject);
SubObject subObject1 = new SubObject(200,"二百");
SubObject subObject2 = new SubObject(300,"三百"); Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
boolean b = reference.compareAndSet(subObject, subObject1);
SubObject object = reference.get();
System.out.println(b);
System.out.println(object);
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.currentThread().sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("=============");
System.out.println(reference.get());
boolean b = reference.compareAndSet(subObject, subObject2);
System.out.println(b);
System.out.println(reference.get());
}
});
t1.start();
t2.start();
}
}
/*输出结果:
true
SubObject{intNum=200, string='二百'}
=============
SubObject{intNum=200, string='二百'}
false
SubObject{intNum=200, string='二百'}*/ class SubObject {
public int intNum;
public String string; public int getIntNum() {
return intNum;
} public void setIntNum(int intNum) {
this.intNum = intNum;
} public String getString() {
return string;
} public void setString(String string) {
this.string = string;
} public SubObject(int intNum, String string) {
this.intNum = intNum;
this.string = string;
} public SubObject() {
} @Override
public String toString() {
return "SubObject{" +
"intNum=" + intNum +
", string='" + string + '\'' +
'}';
}
}

AtomicStampedReference AtomicReference解决CAS机制中ABA问题的更多相关文章

  1. 基于CAS分析对ABA问题的一点思考

    基于CAS分析对ABA问题的一点思考 什么是CAS? 背景 synchronized加锁消耗太大 volatile只保证可见性,不保证原子性 基础 用CPU提供的特殊指令,可以: 自动更新共享数据; ...

  2. Java 反照机制中 getMethod()和getDeclaredField()区别

    Java 反射机制中 getMethod()和getDeclaredField()区别 今天在程序中用到java反射机制时,遇到的问题记录一下:我当时遇到的问题是,我用反射getMethod()调用类 ...

  3. 解决服务器复制中SID冲突问题

    解决服务器复制中SID冲突问题 如果你有多部的主机需要安装,最快的方法是什么?想必就是用像GHOST之类的软件来进行硬盘的复制.当然,如果是安装在虚拟机之中,则需要复制虚拟的硬盘档案即可,以微软的VP ...

  4. MySQL InnoDB 日志管理机制中的MTR和日志刷盘

    1.MTR(mini-transaction) 在MySQL的 InnoDB日志管理机制中,有一个很重要的概念就是MTR.MTR是InnoDB存储擎中一个很重要的用来保证物理写的完整性和持久性的机制. ...

  5. dubbo源码分析2——SPI机制中的SPI实现类的读取和预处理

    SPI机制中的SPI实现类的读取和预处理是由ExtensionLoader类的loadFile方法来完成的 loadFile方法的作用是读取dubbo的某个SPI接口的spi描述文件,然后进行缓存,缓 ...

  6. java多线程机制中的Thread和Runnable()区别

    1.java语言使用Thread类及其子类对象来表示线程,新建的一个线程声明周期中经历 新建.(声明一个线程,此时他已经有了相应的内存空间和其他资源),运行(线程创建之久就据用了运行的条件,一旦轮到使 ...

  7. Linux内存管理机制中buffer和cache的区别

    Linux内存管理机制中buffer和cache的区别理解linux内存管理,需要深入了解linux内存的各个参数含义和规则,下面介绍一下Linux操作系统中内存buffer和cache的区别. Fr ...

  8. CAS导致的ABA问题及解决:时间戳原子引用AtomicReference、AtomicStampedReference

    1.CAS导致ABA问题: CAS算法实现一个重要前提需要取出内存中某时刻的数据并在当下时刻比较并交换,那么在这个时间差中会导致数据的变化. 比如:线程1从内存位置V中取出A,这时线程2也从V中取出A ...

  9. JUC 并发编程--05, Volatile关键字特性: 可见性, 不保证原子性,禁止指令重排, 代码证明过程. CAS了解么 , ABA怎么解决, 手写自旋锁和死锁

    问: 了解volatile关键字么? 答: 他是java 的关键字, 保证可见性, 不保证原子性, 禁止指令重排 问: 你说的这三个特性, 能写代码证明么? 答: .... 问: 听说过 CAS么 他 ...

随机推荐

  1. 构建前端第5篇之---修改css样式的思路

    张艳涛写于2020-1-20 在页面元素布局的时候,在知道应该如何设置元素的属性的时候,可以依照如下思路,使用chrome浏览器,打开f12,找到对应的最近元素,看右侧对于的css样式窗口,调整修改数 ...

  2. JS对DOM的操作优化法则

    html页面显示过程 解析HTML,并生成一棵DOM tree 解析各种样式并结合DOM tree生成一棵Render tree 对Render tree的各个节点计算布局信息,比如box的位置与尺寸 ...

  3. GitHub秘钥(SSH Key)

    一.公钥的作用 公钥一般给服务器,别人权限中加入我给的公钥,当我们从远地仓库中下载项目(git clone xxx)的时 那个服务器通过他的绑定的公钥来匹配我的私钥,如果匹配,则就可以正常下载,如果不 ...

  4. DC-1 靶机渗透测试

    DC-1靶机渗透测试 对着镜子大喊三声"太菜了""太菜了""太菜了" DC系列靶机的第一篇.边学习边日靶机边进步,摸爬滚打着前行. 内容不只 ...

  5. 打开JAVA之门:idea的安装及JAVA环境的创建

    打开JAVA之门:idea的安装及JAVA环境的创建 1.idea的下载安装 首先打开 ->->->(IntelliJ IDEA: The Capable & Ergonom ...

  6. CF877B Nikita and string TJ

    前言的前言 本 TJ 同步发布于洛谷,在线求赞(bushi 前言 蒟蒻第一篇题解,在线求审核大大给过 awa. 如果此题解有什么问题的话欢迎各位大巨佬提出. 题目链接:CF877B 题目类型:dp,一 ...

  7. 计算机网络模型和5G知识

    目录 一.网络布线及信号传输 1.信号 2.传输介质 2.1双绞线 2.2光纤 2.3常见性问题 三.无线传播介质 四.综合布线系统 五.计算机的数制度以及运算 一.网络布线及信号传输 1.信号 频率 ...

  8. ElasticSearch进阶检索

    ElasticSearch进阶检索 入门检索中讲了如何导入elastic提供的样本测试数据,下面我们用这些数据进一步检索 一.SearchAPI ES 支持两种基本方式检索 : 1.一种是通过使用 R ...

  9. Vulhub-DC-3靶场

    Vulhub-DC-3靶场 前言 今天把DC-3的靶场打了一遍,可以说这个靶场用到的思路是非常经典的,从信息搜集到漏洞利用包括内核提权.最最重要的是为了下载它的提权EXP,我它喵还花了一块二买了个CS ...

  10. 我的大学Android开发学习之路——从开始到微信/支付宝/抖音Offer

    前言 笔者2016年高考考入华中科技大学计算机科学与技术专业. 2017年底(大二寒假)拿到今日头条(字节跳动)深圳研发中心Android开发实习生Offer,在深圳研发中心实习至2018年3月. 2 ...