`

Java原子变量与ABA问题(转发)

阅读更多

原文地址:http://www.xiaoyaochong.net/wordpress/?p=201 | 逍遥冲

 

ABA问题是一种异常现象:如果在算法中的节点可以被循环使用,那么在使用“比较并交换”指令时就可能出现这个问题(如果在没有垃圾回收机制的环境 中)。在CAS操作中将判断“V的值是否仍然为A?”,并且如果是的话就继续执行更新操作。在大多数情况下,这种判断是足够的。然而,有时候还需要知道 “自从上次看到V的值为A以来,这个值是否发生了变化?”在某些算法中,如果V值首先由A编程B,在由B编程A,那么仍然被认为发生了变化,并需要重新执 行算法中的某些步骤。

 

如果在算法中采用自己的方式来管理节点对象的内存,那么可能出现ABA问题。在这种情况下,即使链表的头结点仍然只想之前观察到的节点,那么也不足 以说明链表的内容没有发生变化。如果通过垃圾回收器来管理链表节点仍然无法避免ABA问题,那么还有一个相对简单的解决方法:不是只是更新某个引用的值, 而是更新两个值,包含一个引用和一个版本号。即使这个值由A变成B,然后又变为A,版本号也将是不同的。AtomicStampedReference以 及AtomicMarkableReference支持在两个变量上执行原子的条件更新。AtomicStampedReference将更新一个“对象 —-引用”二元组,通过在引用上加上“版本号”,从而避免ABA问题。类似地,AtomicMarkableReference将更新一个“对象引用—- 布尔值”二元组,在某些算法中将通过这种二元组使节点保存在链表中同时又将其标记为“已删除节点”。

 

本文固定链接: http://www.xiaoyaochong.net/wordpress/?p=201 | 逍遥冲

分享到:
评论

相关推荐

    CAS下ABA问题及优化方案

    CAS下ABA问题及优化方案 CAS(Compare And Set)是一种常见的乐观锁机制,用于降低读写锁冲突,保证数据一致性。但是在极端情况下,CAS 乐观锁机制可能会出现 ABA 问题。本文将从ABA问题的定义、出现原因、优化方案...

    浅谈Java中ABA问题及避免

    在 Java 中,ABA问题可以通过使用锁机制、Atomic 变量和volatile 变量来避免。例如,在并发栈的例子中,可以使用ReentrantLock 锁机制来保证线程安全,避免ABA问题的出现。 ABA问题是Java并发编程中的一种常见问题...

    CAS底层原理与ABA问题.docx

    为了解决这个问题,可以使用版本号或者“戳”来记录变量的状态,如Java中的`AtomicStampedReference`类,它包含了一个值和一个版本号,可以在比较时同时检查值和版本号是否一致。 `Unsafe`类中的`getAndAddInt`方法...

    Java并发的CAS原理与ABA问题的讲解

    另一种策略是使用更强的同步原语,如锁,来确保在任何时刻只有一个线程能够修改变量,从而避免ABA问题。然而,这些方法都可能导致更高的开销和更复杂的代码。 总的来说,虽然CAS提供了一种高效的无锁同步机制,但...

    Java 多线程与并发(8-26)-JUC原子类- CAS, Unsafe和原子类详解.pdf

    Java多线程与并发处理是Java编程中的高级话题,涉及到JUC(java.util.concurrent)包中的原子类、CAS(Compare-And-Swap)机制、Unsafe类以及多线程并发的无锁方案和线程安全的实现方法。 CAS是一种无锁的同步机制...

    ABA生理功能与信号转导相关综述

    通过研究ABA敏感或不敏感的突变体,科学家们识别出了一些与ABA相关的基因和蛋白质。这些基因编码的蛋白质大致分为两大类: 1. **功能蛋白**:这类蛋白质直接参与胁迫耐受,如LEA蛋白和热休克蛋白保护生物大分子和...

    atomicReference 使用和AtomicStampedReference 解决ABA的问题.docx

    然而,CAS虽然解决了原子性问题,但并不能避免ABA问题。ABA问题是指在并发环境下,一个值从A变到B,然后再变回A,而CAS可能只检查值是否还是A,却忽略了它曾经变为B的过程。这个比喻中,你手中的手提箱虽然看起来...

    ABA专题:自闭症儿童ABA实操流程解析.doc

    ABA 专题:自闭症儿童 ABA 实操流程解析 ABA(Applied Behavior Analysis,应用行为分析)是一种基于行为主义理论的干预方法,主要用于自闭症儿童的 habilization 和 rehabilation。ABA 的核心是通过对行为的观察和...

    聊聊并发(5)原子操作的实现原理Java开发Java经验技

    为了解决这个问题,Java的AtomicStampedReference类引入了版本戳,可以记录变量的修改次数。 在实际编程中,我们可以通过以下几种方式利用Java的原子类: 1. 自旋锁:原子类可以作为自旋锁的基础,当一个线程发现...

    技术分享-JAVA并发库解读

    #### CAS与ABA问题 Compare-and-Swap (CAS) 是一种常用的原子操作,用于实现无锁算法。它通过比较预期值与当前值是否一致来决定是否更新变量的值。然而,CAS存在ABA问题,即当一个值由A变为B然后再变回A时,CAS无法...

    JAVA面试题2019

    9. **Java内存模型**:解释变量的可见性、有序性和原子性。 10. **线程池调优**:如何根据应用的特点合理配置线程池。 11. **ThreadLocal** 的使用注意事项。 12. **CountDownLatch** 与 **CyclicBarrier** 的用法及...

    Java面试.docx

    - CAS的缺点包括循环时间长、只能保证单个共享变量的原子操作,以及可能出现ABA问题。 5. **ABA问题**: - 当一个值从A变为B,然后又变回A时,CAS操作可能无法检测到中间的变化,可能导致错误的结果。 - 解决ABA...

    Java并发编程全景图.pdf

    非阻塞同步通过比较交换算法(CAS)实现,它通常比传统锁更快,但可能会面临ABA问题。非阻塞同步还包括无锁(Lock-free)和无障碍(Obstruction-free)算法。 11. 并发工具类 Java并发工具类扩展了基本的并发功能,...

    JAVA CAS实现原理与使用.docx

    Java并发编程中,CAS(Compare and Swap,比较并交换)是一种无锁算法,它提供了一种在多线程环境下更新共享变量的方式,避免了传统锁机制带来的诸多问题。在JDK 5之前,Java主要依赖`synchronized`关键字来保证线程...

    Java很好的学习笔记4 无锁.md,学习代码

    1. 原子变量类:详细讲解了Java中的AtomicInteger、AtomicLong等类的工作原理和使用场景。 2. CAS操作:解释了CAS操作的原理,如何避免死循环(自旋锁)以及ABA问题,并讨论了Java如何通过乐观锁策略解决ABA问题。 3...

    CAS学习手册-JAVA程序员必备

    CAS机制通过比较内存地址V的预期值A与实际值,并在两者相同时,将值替换为B,以此实现对变量的原子性更新,从而避免了锁的使用,降低了锁带来的性能开销。 1. **场景引入与问题** 在多线程环境下,简单的计数器...

    ABa格式ABa格式.docABa格式.docABa格式.doc

    ABa格式.docABa格式.docABa格式.docABa格式.doc

    Java高并发编程详解.md

    ```AtomicStampedReference```来解决ABA问题,类中的```compareAndSet```方法作用首先检查当前引用是否等于预期引用,并且当前标志是否等于预期标志,如果相等,以原子方式将该引用和标记的值设置为给定的更新值。

    java编译用库文件

    java编译用库文件,该文件系库文件,在导入库文件中导入该库文件。

Global site tag (gtag.js) - Google Analytics