并发编程cas的aba问题
2017-06-15 18:22
99 查看
多线程环境下,两个线程A,B可能会对共享数据m进行操作。为了保证一个线程在读到数据跟写入数据之间没有被其他线程修改过,使用cas解决。
cas:更改之前先判断旧值是否有变化,如果没有变化,认为没有线程对该共享值做过操作。(
这种认为是有一下问题的,
B线程已经对数据做了两次修改,而A却并不清楚这个修改,以为是没有任何线程对其做修改。
这个问题称之为aba。
aba问题解决:使用修改字段加时间戳,在cas判断m值的时候,同时对时间戳进行判断。如果时间戳不一样,说明其他线程对该字段进行了修改。
cas:更改之前先判断旧值是否有变化,如果没有变化,认为没有线程对该共享值做过操作。(
这种认为是有一下问题的,
时 | 线程A | 线程B |
T1 | 读m值为1 | |
T2 | 读m值为1 | |
T3 | 查询m值是否为1,并更新m值为2 | |
T4 | 读m值为2 | |
T5 | 查询m值是否为2,并更新m值为1 | |
T6 | 查询m值是否为1,并更新m值为2 | |
这个问题称之为aba。
aba问题解决:使用修改字段加时间戳,在cas判断m值的时候,同时对时间戳进行判断。如果时间戳不一样,说明其他线程对该字段进行了修改。
相关文章推荐
- 一个可无限伸缩且无ABA问题的无锁队列
- lock-free/wait-free算法以及ABA问题
- 关于我对ABA问题的理解
- ABA问题及避免
- ABA问题
- Java并发编程笔记 Native方法,CAS操作与ABA问题
- FJ的字符串 /*问题描述 FJ在沙盘上写了这样一些字符串: A1="A" A2="ABA" A3="ABACABA" A4="ABACABADABACABA" ... ...
- 无锁编程(四) - CAS与ABA问题
- 无锁队列以及ABA问题
- AtomicStampedReference解决ABA问题
- Java CAS 和ABA问题
- 聊聊高并发(十二)分析java.util.concurrent.atomic.AtomicStampedReference源码来看如何解决CAS的ABA问题
- JAVA与ABA问题
- 用链表实现的无锁栈和无锁队列存在的ABA问题
- ABA问题简述(待续)
- 用AtomicStampedReference解决ABA问题
- ABA问题及其java解决方案
- 用AtomicStampedReference解决ABA问题(转)
- CAS操作ABA问题发生的场景
- ABA问题