ABA问题

ABA问题是CAS中的问题,假设CAS中V表示需要读写的内存位置,A是进行比较的值,B将要写入的新值。ABA问题的原因在于有时需要知道V处的值是否发生了变化,如果V处的值由A变成B,再由B变成了A,那么一般会忽略这种变化,因为自上次检测以来,V处的值还是A。AtomicStampedReference以及AtomicMarkableReference可以避免ABA问题。因为他们还会维持一个对象的“版本号”(这两个类使用的方式不一样,都类似于标注一个对象的版本),即使A从B又变回了A,但是两个A版本却发生了变化,所以避免了ABA问题。

时间: 2024-10-14 05:28:33

ABA问题的相关文章

装逼名词-ABA

今天看wiki,看到一个提到什么什么会陷入 race condition & ABA problem.丫的我没听过ABA呀,那么我去搜了一下,如下: http://www.bubuko.com/infodetail-317006.html <SpinLock 自旋锁, CAS操作(Compare & Set) ABA Problem> ABA解释如下: 所谓ABA(见维基百科的ABA词条),问题基本是这个样子: 进程P1在共享变量中读到值为A P1被抢占了,进程P2执行 P2把

无锁编程:lock-free原理;CAS;ABA问题

转自:http://blog.csdn.net/kangroger/article/details/47867269 定义 无锁编程是指在不使用锁的情况下,在多线程环境下实现多变量的同步.即在没有线程阻塞的情况下实现同步.这样可以避免竞态.死锁等问题. 原理 CAS是指Compare-and-swap或Compare-and-Set CAS是一个原子操作,用于多线程环境下的同步.它比较内存中的内容和给定的值,只有当两者相同时(说明其未被修改),才会修改内存中的内容. 实现如下: int comp

SpinLock 自旋锁, CAS操作(Compare &amp; Set) ABA Problem

SpinLock 自旋锁 spinlock 用于CPU同步, 它的实现是基于CPU锁定数据总线的指令. 当某个CPU锁住数据总线后, 它读一个内存单元(spinlock_t)来判断这个spinlock 是否已经被别的CPU锁住. 如果否, 它写进一个特定值, 表示锁定成功, 然后返回. 如果是, 它会重复以上操作直到成功, 或者spin次数超过一个设定值. 锁定数据总线的指令只能保证一个机器指令内, CPU独占数据总线. 单CPU当然能用spinlock, 但实现上无需锁定数据总线. spinl

Java CAS 和ABA问题

http://www.cnblogs.com/549294286/p/3766717.html 独占锁:是一种悲观锁,synchronized就是一种独占锁,会导致其它所有需要锁的线程挂起,等待持有锁的线程释放锁. 乐观锁:每次不加锁,假设没有冲突去完成某项操作,如果因为冲突失败就重试,直到成功为止. 一.CAS 操作 乐观锁用到的机制就是CAS,Compare and Swap. CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B.当且仅当预期值A和内存值V相同时,将内存值V修改为B,

ABA数据传输格式

我们经常见到许多卡片和存折的背面有一个黑色的磁条,这种卡片一般称为磁卡.磁卡的使用已经有很长的历史了.由于磁卡成本低廉,易于使用,便于管理,因此它的发展得到了很多世界知名公司,特别各国政府部门的鼎立支持,使得磁卡的应用非常普及,尤其是在银行系统几十年的普遍推广使用,使得磁卡的普及率非常高. 磁卡磁条记录数据的原理和录音机磁带类似.磁带上一般有4个磁道,分别记录两个方向上的左右声道.磁条上有3个磁道.磁道1与磁道2是只读磁道,在使用时磁道上记录的信息只能读出而不允许写或修改.磁道3为读写磁道,在使

CAS ABA问题

接触并发编程少不了CAS,这里不讲CAS,在另一篇文章里面有写CAS,这里只关注CAS的ABA问题. 什么叫CAS的ABA问题? 因为CAS需要在操作值的时候检查下值有没有发生变化,如果没有发生变化则更新,但是如果一个值原来是A,变成了B,又变成了A,那么使用CAS进行检查时会发现它的值没有发生变化,但是实际上却变化了. 比如线程A操作值a,将值修改为b,这时线程B也拿到了a的值,将a改为b,再改为a,这时线程A比对值的时候,发送值还是和expect的一样,就会继续操作.如下面代码,T2的CAS

传说中的并发编程ABA问题

什么是ABA问题 ABA并不是一个缩写,更像是一个形象的描述.ABA问题出现在多线程或多进程计算环境中. 首先描述ABA.假设两个线程T1和T2访问同一个变量V,当T1访问变量V时,读取到V的值为A:此时线程T1被抢占了,T2开始执行,T2先将变量V的值从A变成了B,然后又将变量V从B变回了A:此时T1又抢占了主动权,继续执行,它发现变量V的值还是A,以为没有发生变化,所以就继续执行了.这个过程中,变量V从A变为B,再由B变为A就被形象地称为ABA问题了. 上面的描述看上去并不会导致什么问题.T

2.原子--AtomicStampedReference解决ABA问题

AtomicStampedReference解决ABA问题 在运用CAS做Lock-Free操作中有一个经典的ABA问题: 线程1准备用CAS将变量的值由A替换为B,在此之前,线程2将变量的值由A替换为C,又由C替换为A,然后线程1执行CAS时发现变量的值仍然为A,所以CAS成功.但实际上这时的现场已经和最初不同了,尽管CAS成功,但可能存在潜藏的问题,例如下面的例子: 现有一个用单向链表实现的堆栈,栈顶为A,这时线程T1已经知道A.next为B,然后希望用CAS将栈顶替换为B: head.co

聊聊高并发(十二)分析java.util.concurrent.atomic.AtomicStampedReference源码来看如何解决CAS的ABA问题

在聊聊高并发(十一)实现几种自旋锁(五)中使用了java.util.concurrent.atomic.AtomicStampedReference原子变量指向工作队列的队尾,为何使用AtomicStampedReference原子变量而不是使用AtomicReference是因为这个实现中等待队列的同一个节点具备不同的状态,而同一个节点会多次进出工作队列,这就有可能出现出现ABA问题. 熟悉并发编程的同学应该知道CAS操作存在ABA问题.我们先看下CAS操作. CAS(Compare and