Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >关于java CAS相关的ABA问题总结

关于java CAS相关的ABA问题总结

作者头像
海涛
发布于 2020-06-22 07:48:49
发布于 2020-06-22 07:48:49
47600
代码可运行
举报
文章被收录于专栏:海涛技术日常海涛技术日常
运行总次数:0
代码可运行

ABA本质是并发情况下使用cas修改数据,在都成功的情况下丢失一次修该信息,比如 A-C-D,A-B-C

ABA是否对程序造成影响是否需要解决?

1.如果只是单纯的数值数据,无业务关联逻辑,没有影响,比如Lock锁的实现就不考虑这个问题,因此如果只是单纯的技术或者统计请忽略aba问题

2.如果数据是有业务含义的就需要处理,尤其是资金问题

java里面的解决办法

1.操作同一个对象的时候,每次都通过new新对象进行包装(其实变相避免了两个A的出现),如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ConcurrentStack {
    AtomicReference<Node> top = new AtomicReference<Node>();
    public void push(String item){
        Node newTop = new Node(item);
        Node oldTop;
        do{
            oldTop = top.get();
            newTop.next = oldTop;
        }
        while(!top.compareAndSet(oldTop, newTop));
    }
    public String pop(){
        Node newTop;
        Node oldTop;
        do{
            oldTop = top.get();
            if(oldTop == null){
                return null;
            }
            newTop = oldTop.next;
        }
        while(!top.compareAndSet(oldTop, newTop));
        return oldTop.item;
    }
}

2.常规办法 使用 AtomicStampedReference 或者 AtomicMarkableReference

AtomicStampedReference可以知道,引用变量中途被更改了几次。有时候,我们并不关心引用变量更改了几次,只是单纯的关心是否更改过,所以就有了AtomicMarkableReference。AtomicMarkableReference的唯一区别就是不再用int标识引用,而是使用boolean变量——表示引用变量是否被更改过。构造函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private static AtomicStampedReference atomicStampedRef = new AtomicStampedReference(100, 0);
atomicStampedRef.compareAndSet(100, 101, atomicStampedRef.getStamp(), atomicStampedRef.getStamp() + 1);
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ABA问题_乐观锁aba引发的实际问题
ABA问题是在多线程并发的情况下,发生的一种现象。上一次记录了有关CAS操作的一些知识,CAS通过比较内存中的一个数据是否是预期值,如果是就将它修改成新值,如果不是则进行自旋,重复比较的操作,直到某一刻内存值等于预期值再进行修改。而ABA问题则是在CAS操作中存在的一个经典问题,这个问题某些时候不会带来任何影响,某些时候却是影响很大的。
全栈程序员站长
2022/11/19
9350
ABA问题_乐观锁aba引发的实际问题
并发编程之CAS算法ABA问题分析和解决
在前面《并发编程之CAS算法与原子变量详解》我们采用JUC包下的Atomic原子变量,解决了多线程环境下共享变量原子性问题,Atomic底层操作是基于CAS算法,并且也提到,采用一种无锁的非阻塞算法的实现,乐观锁算法,但是也会有一些缺点。
小明爱吃火锅
2023/11/04
1.7K0
并发编程之CAS算法ABA问题分析和解决
Java-Synchronized
在多线程环境中,对同一个数据进行操作时,很容易出现同步问题。为了解决该问题,java提供了Synchronized手段。
笔头
2022/02/08
4060
Java并发编程CAS
它的功能是判断内存某一个位置的值是否为预期,如果是则更改这个值,这个过程就是原子的。
一觉睡到小时候
2020/05/27
5020
cas与乐观锁(jpa乐观锁)
独占锁是一种悲观锁,synchronized就是一种独占锁;它假设最坏的情况,并且只有在确保其它线程不会造成干扰的情况下执行,会导致其它所有需要锁的线程挂起直到持有锁的线程释放锁。
全栈程序员站长
2022/07/30
8150
cas与乐观锁(jpa乐观锁)
垃圾回收机制与无锁化编程(Garbage Collection and Lock-Free Programming)
垃圾回收机制(GC)对大部分开发者来说应该不陌生,特别是Java开发者或多或少都跟GC打过交道。 GC的优点是实现对堆上分配的内存动态回收,避免内存泄漏。但是GC的缺点是对性能有一定影响,特别是stop the world问题, 而且GC什么时候回收内存是不确定的,开发者无法知晓。
王璞
2020/07/14
8680
AtomicStampedReference解决CAS的ABA问题
我们都知道在使用CAS方法进行无锁自加或者更换栈的表头之类的问题时会出现ABA问题 Java中使用AtomicStampedReference来解决CAS中的ABA问题,它不再像compareAndSet方法中只比较内存中的值也当前值是否相等,而且先比较引用是否相等,然后比较值是否相等,这样就避免了ABA问题。 那么AtomicStampedReference的基本用法是什么呢?看如下:
名字是乱打的
2022/05/13
2730
java应用CAS
  CAS(Compare and Swap),即比较并替换。jdk里的大量源码通过CAS来提供线程安全操作,比如AtomicInteger类。下面我们来分析一下AtomicInteger是如何在多线程的环境下保证线程安全的。在AtomicInteger里定义了用于存值的value变量,与用于操作value的Unsafe以及value变量的偏移量。源码如下:
良辰美景TT
2018/09/11
9110
java应用CAS
Java并发必知必会第三弹:用积木讲解ABA原理 |老婆居然又听懂了!
上一节我们讲了程序员深夜惨遭老婆鄙视,原因竟是CAS原理太简单?,留了一个彩蛋给大家,ABA问题是怎么出现的,为什么不是AAB拖拉机,AAA金花,4个A炸弹 ?这一篇我们再来揭开ABA的神秘面纱。
悟空聊架构
2020/08/27
3900
AtomicStampedReference是怎样解决CAS的ABA问题
但凡对Java有一点深入就会知道 CAS,即 compareAndSwap。在Java中使用 Unsafe 类提供的native方法可以直接操作内存,其中就有对compareAndSwap的实现。
龟仙老人
2020/12/15
1.8K0
CAS Krains 2020-08-25
其中的关键是 compareAndSet,它的简称就是 CAS (也有 Compare And Swap 的说法),该方法是原子的。
Krains
2020/09/10
3410
CAS  Krains 2020-08-25
Java并发编程实战系列15之原子遍历与非阻塞同步机制(Atomic Variables and Non-blocking Synchronization)
近年来,在并发算法领域的大多数研究都侧重于非阻塞算法,这种算法用底层的原子机器指令来代替锁来确保数据在并发访问中的一致性,非阻塞算法被广泛应用于OS和JVM中实现线程/进程调度机制和GC以及锁,并发数据结构中。 与锁的方案相比,非阻塞算法都要复杂的多,他们在可伸缩性和活跃性上(避免死锁)都有巨大的优势。 非阻塞算法,顾名思义,多个线程竞争相同的数据时不会发生阻塞,因此他能在粒度更细的层次上进行协调,而且极大的减少调度开销。 15.1 锁的劣势 独占,可见性是锁要保证的。 许多JVM都对非竞争的锁获取和释放
JavaEdge
2018/04/28
8200
深入理解 CAS 原理 | Java
在看到 Compare 和 Swap 后,我们就应该知道,CAS 里面至少包含了两个动作,分别是比较和交换,在现在的 CPU 中,为这两个动作专门提供了一个指令,就是CAH 指令,由 CPU 来保证这两个操作一定是原子的,也就是说比较和交换这两个操作只能是要么全部完成,要么全部没有完成
345
2022/02/11
9160
并发编程系列之掌握原子类使用
如果不加锁,仅仅使用volatile关键字?运行几次,发现统计的数值是有偏差的,所以volatile是不一定能保证线程安全的
SmileNicky
2021/12/06
2310
并发编程系列之掌握原子类使用
Java并发编程之cas理论(无锁并发)
前面看到的AtomicInteger的解决方法,内部并没有用锁来保护共享变量的线程安全。那么它是如何实现的呢?
Java微观世界
2025/01/21
1100
Java并发编程之cas理论(无锁并发)
并发编程之CAS和ABA问题
独占锁:是一种悲观锁,synchronized就是一种独占锁,会导致其它所有需要锁的线程挂起,等待持有锁的线程释放锁。
lyb-geek
2022/03/10
2290
并发编程之CAS和ABA问题
【高薪程序员必看】万字长文拆解Java并发编程!(6-1):从CAS无锁机制到Atomic原子类实战指南
今天给大家带来的是 ​​《Java高并发编程核心:CAS无锁机制与原子类深度解析》​ 💻⚡
摘星.
2025/05/20
1380
CAS之比较并交换
compare and swap的缩写,中文翻译成比较并交换,实现并发算法时常用到的一种技术。它包含三个操作数——内存位置、预期原值及更新值。 执行CAS操作的时候,将内存位置的值与预期原值比较: 如果相匹配,那么处理器会自动将该位置值更新为新值, 如果不匹配,处理器不做任何操作,多个线程同时执行CAS操作只有一个会成功。
鱼找水需要时间
2023/02/16
4420
CAS之比较并交换
简单理解CAS
CAS(Compare And Set)比较交换,是一种无锁算法。即不使用锁的方式来实现多线程同步。由于是无锁的策略,也就是在没有线程被阻塞的情况下实现变量同步,所以也叫非阻塞同步(Non-blocking Synchronization)。
有一只柴犬
2024/01/25
1730
简单理解CAS
cas 原理分析
顾名思义,就是很悲观,假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁。
全栈程序员站长
2022/11/03
3830
cas 原理分析
相关推荐
ABA问题_乐观锁aba引发的实际问题
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验