CAS的ABA问题描述 AtomicStampReference

CAS的ABA问题描述

  • 在CAS操作的时候,其他线程将当前变量的值从A改成B,又改回A;
  • CAS线程用期望值A与当前变量比较的时候,发现当前变量没有变,于是CAS就将当前变量进行了交换操作,但其实当前变量改变过,这与设计思想是不符合的;
  • ABA问题的解决思路:每次当前变量更新的时候,将当前变量的版本号加1;

AtomicStampReference示例

  • public boolean compareAndSet(
    V expectedReference,
    V newReference,
    int expectedStamp,
    int newStamp)
    • 如果当前值和expectedReference相等,并且当前stamp和expectedStamp相等,把当前值更新为newReference,当前stamp更新为newStamp,并返回true;
    • 如果不满足条件,不更新,并返回false;
 
import java.util.concurrent.TimeUnit;import java.util.concurrent.atomic.AtomicInteger;import java.util.concurrent.atomic.AtomicStampedReference;public class ABA {private static AtomicInteger atomicInt= new AtomicInteger(100);private static AtomicStampedReference atomicStampedRef= new AtomicStampedReference(100, 0);public static void main(String[] args) throws InterruptedException {Thread intABA = new Thread(new Runnable() {@Overridepublic void run() {atomicInt.compareAndSet(100, 101);atomicInt.compareAndSet(101, 100);}});Thread intCAS = new Thread(new Runnable() {@Overridepublic void run() {try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {}boolean isUpdated = atomicInt.compareAndSet(100, 101);System.out.println("Thread AtomicInteger CAS isUpdated: " + isUpdated); // true}});intABA.start();intCAS.start();intABA.join();intCAS.join();Thread refABA = new Thread(() -> {try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {}atomicStampedRef.compareAndSet(100, 101, atomicStampedRef.getStamp(), atomicStampedRef.getStamp() + 1);atomicStampedRef.compareAndSet(101, 100, atomicStampedRef.getStamp(), atomicStampedRef.getStamp() + 1);});Thread refCAS = new Thread(() -> {int stamp = atomicStampedRef.getStamp(); // 0try {TimeUnit.SECONDS.sleep(2);} catch (InterruptedException e) {}boolean isUpdated = atomicStampedRef.compareAndSet(100, 101, stamp, stamp + 1);System.out.println("Thread AtomicStampedReference CAS isUpdated: " + isUpdated); // false});refABA.start();refCAS.start();}}

输出:

Thread AtomicInteger CAS isUpdated: true
Thread AtomicStampedReference CAS isUpdated: false

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/386500.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[转]OpenContrail 体系架构文档

OpenContrail 体系架构文档英文原文:http://opencontrail.org/opencontrail-architecture-documentation/ 翻译者:KkBLuE知行合一 其微信号:kkbluepublic, SDNAP.com翻译整理 OpenContrail 体系架构文档 1 概述 1.1 使用案例 1…

这份354页笔记的Android进阶知识+大厂高频面试题,绝对干货

程序员与别的专业有所不同,其他专业都是越老越香,而程序员却是一个例外,因为计算机技术更新太快,而且工作强度很大,因此大部分程序员只会写 3 年代码。3 年后要不晋升做项目经理,要么转行,个别研…

原子性 atomic 类用法

当程序更新一个变量时,如果多线程同时更新这个变量,可能得到期望之外的值,比如变量i1,A线程更新i1,B线程也更新i1,经过两个线程操作之后可能i不等于3,而是等于2。因为A和B线程在更新变量i的时候…

这是一份用心整理的Android面试总结,聪明人已经收藏了!

前言 本文想分享的是如何准备阿里面试的以及面试过程的所想所得,希望能帮到你。 首先,可能要让你们失望的是,这篇文章不会有大篇幅的面试题答案。如果想要看这方面的内容,可以看我之前的文章。感谢关注 很多人准备面试的时候&a…

git 技能图

---- 转载于:https://www.cnblogs.com/WHWWHW/p/11136606.html

AtomicStampedReference源码分析

之前的文章已经介绍过CAS的操作原理,它虽然能够保证数据的原子性,但还是会有一个ABA的问题。 那么什么是ABA的问题呢?假设有一个共享变量“num”,有个线程A在第一次进行修改的时候把num的值修改成了33。修改成功之后,紧接着又立刻…

django:bootstrap table加载django返回的数据

bootstrap table加载表格数据有两类方式: 一种通过data属性的方式配置,一种是javascipt方式配置 这里看js配置方式: 1、当数据源为.json文件时 url参数写上json文件的地址就行,但是json文件格式必须为json格式(2种): a:一种为json…

这是一份面向Android开发者的复习指南,成功入职字节跳动

前言 19年6月份从网易云音乐离开,放弃了留学机会,开始了人生的第一次创业,前后尝试了两个项目,因为个人能力与时机因素都失败了,虽然没能享受到创业所能够带来高杠杆物质上的回报,但是对个人软技能和自我边…

JVM启动参数

不管是YGC还是Full GC,GC过程中都会对导致程序运行中中断,正确的选择不同的GC策略,调整JVM、GC的参数,可以极大的减少由于GC工作,而导致的程序运行中断方面的问题,进而适当的提高Java程序的工作效率。但是调整GC是以个极为复杂的过程&#xf…

【UOJ 92】有向图的强连通分量

【题目描述】: 有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通(strongly connected)。如果有向图G…

这篇文章可以满足你80%日常工作!一线互联网公司面经总结

前言 最近发现大家都喜欢看面试相关的文章,我也跟一波风,总结了一下我面试中所遇到的问题总结,分享一下面试中被问的最多的一些问题。 希望对正在找工作的朋友提供一些帮助。 好了话不多说,进入正题。 作为安卓开发者&#xff…

java并发synchronized 锁的膨胀过程(锁的升级过程)深入剖析(1)

我们先来说一下我们为什么需要锁? 因为在并发情况为了保证线程的安全性,是在一个多线程环境下正确性的概念,也就是保证多线程环境下共享的、可修改的状态的正确性(这里的状态指的是程序里的数据),在java程…

MSCRM二次开发实现自动编号功能

功能描述:对客户实体实现自动编号功能,1、2、3、4...... 自动编号存放于属性accountnumber.原  理:在mscrm服务器用一个文本文件存放当前最新编号,每当创建客户记录时在PreCreate事件接口做以下步骤:1、锁定文本文件…

这篇文章可以满足你80%日常工作!成功入职腾讯

什么是中年危机 根据权威数据显示,国内IT程序员鼎盛时期是在25-27岁左右,30岁对于程序员而言完全是一个38线,接着就是转业转岗的事情,这一点在业界也算是一个共识了。 大学毕业步入IT行业普遍年龄也是在22岁左右,然而…

java并发synchronized 锁的膨胀过程(锁的升级过程)深入剖析(2)

接下来我们分析两个批量偏向撤销的相关案例(禁止偏向锁延迟的情况下:-XX:UseBiasedLocking -XX:BiasedLockingStartupDelay0): 案例一: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28…

System.Configuration命名空间下的关键类

1.ConfigurationManager和 WebConfigurationManager类: 使用 ConfigurationManager 类,可以访问计算机和应用程序的配置信息。ConfigurationManager 是处理客户端应用程序配置文件的首选方法;不推荐使用任何其他方法。对于 Web 应用程序&…

连续四年百度Android岗必问面试题!Android校招面试指南

前言 刚从阿里面试回来,想和大家分享一些我的面试经验,以及面试题目。 这篇文章将会更加聚焦在面试前需要看哪些资料,一些面试技巧以及一些这次的面试考题。 面试经历 7月确定想走后开始看各种面经,复习基础知识,月…

Spring Boot教程(11) – 理解注解@ControllerAdvice

之前,我们介绍过ModelAttribute和ExceptionHandler,前者可以往请求的Model里加数据,后者可以接受请求处理方法抛出的异常。但是他们放在控制器(Controller)里的时候,作用范围是有限的,只管当前控制器里的方法。如果你有几百个控制…

透彻解析!字节跳动Android实习面试凉凉经,年薪超过80万!

什么是Kotlin? Kotlin,如前面所说,它是JetBrains开发的基于JVM的语言。JetBrains因为创造了一个强大的Java开发IDE被大家所熟知。Android Studio,官方的Android IDE,就是基于Intellij,作为一个该平台的插件。 Kotli…

synchronized 底层如何实现?什么是锁升级、降级?

synchronized 底层如何实现?什么是锁升级、降级? synchronized 代码块是由一对 monitorenter/monitorexit 指令实现的,Monitor 对象是同步的基本实现单元。 https://docs.oracle.com/javase/specs/jls/se10/html/jls-8.html#d5e13622 在Jav…