当前位置:网站首页>ABA问题遇到过吗,详细说以下,如何避免ABA问题
ABA问题遇到过吗,详细说以下,如何避免ABA问题
2022-07-06 09:20:00 【快醒醒鸭今天你编程了吗?】
1、有两个线程同时修改一个变量的值,线程1、线程2,都更新变量值,将变量从A更新为B
2、首先线程1获得到CPU时间片,线程2由于某些原因原因发生等待,线程1进行比较更新,CAS
(CompareAndSwap),成功将变量的值从A更新到B
3、更新完毕后,恰好又有线程3进来想要把变量的值从B更新到A,线程3进行比较更新,成功将变量的值从B更新为A
4、线程2获得到CPU时间片,然后进行比较更新,发现值是预期的A,然后又更新成了B,但是线程1并不知道该值已经从A-->B-->A这个过程,这就是ABA问题。
如何避免ABA问题?
可以通过加版本号或者时间戳解决,或者保证单向递增或递减就不会存在此类问题,atomic包下的AtomicStampedReference类的CompareAndSet方法首先检查当前引用是否等于预期引用,并且当前标志是否等于预期标志,如果全部相等,则以原子方式将该标志的值设置给定的更新值
package com.ws.cas;
import java.util.concurrent.atomic.AtomicInteger;
public class CASDemo {
//CAS compareAndSet:比较并交换!!!
public static void main(String[] args) {
AtomicInteger atomicInteger = new AtomicInteger(2020);
//对于我们平时写的SQL来说:乐观锁!
//第一个参数是期望、第二个参数是更新
//public final boolean compareAndSet(int expect, int update)
//如果我期望的值达到了,那么就更新,否则就不更新 CAS是CPU的并发原语
//乱搞线程
System.out.println(atomicInteger.compareAndSet(2020, 2021));
System.out.println(atomicInteger.get());
System.out.println(atomicInteger.compareAndSet(2021, 2020));
System.out.println(atomicInteger.get());
//期望的线程
System.out.println(atomicInteger.compareAndSet(2020, 6666));
System.out.println(atomicInteger.get());
}
}
CAS导致的其他问题?
- 只能保证一个共享变量的原子操作
- 自旋CAS如果长时间不成功,会给CPU带来开销大的问题
边栏推荐
- 12 excel charts and arrays
- View UI plus releases version 1.1.0, supports SSR, supports nuxt, and adds TS declaration files
- 3.输入和输出函数(printf、scanf、getchar和putchar)
- 魏牌:产品叫好声一片,但为何销量还是受挫
- TYUT太原理工大学2022数据库考试题型大纲
- View UI Plus 发布 1.3.1 版本,增强 TypeScript 使用体验
- 5. Download and use of MSDN
- 初识C语言(上)
- System design learning (I) design pastebin com (or Bit.ly)
- TYUT太原理工大学往年数据库简述题
猜你喜欢
Introduction and use of redis
继承和多态(下)
Questions and answers of "Fundamentals of RF circuits" in the first semester of the 22nd academic year of Xi'an University of Electronic Science and technology
The overseas sales of Xiaomi mobile phones are nearly 140million, which may explain why Xiaomi ov doesn't need Hongmeng
Quickly generate illustrations
Counter attack of flour dregs: redis series 52 questions, 30000 words + 80 pictures in detail.
MYSQL索引钟B-TREE ,B+TREE ,HASH索引之间的区别和应用场景
Questions and answers of "basic experiment" in the first semester of the 22nd academic year of Xi'an University of Electronic Science and technology
1. C language matrix addition and subtraction method
5. Download and use of MSDN
随机推荐
5.MSDN的下载和使用
【九阳神功】2016复旦大学应用统计真题+解析
抽象类和接口
初识C语言(上)
Data manipulation language (DML)
【毕业季·进击的技术er】再见了,我的学生时代
What are the advantages of using SQL in Excel VBA
JS interview questions (I)
Aurora system model of learning database
TYUT太原理工大学2022数据库大题之概念模型设计
Design a key value cache to save the results of the most recent Web server queries
C语言实现扫雷游戏(完整版)
1.C语言矩阵加减法
3.猜数字游戏
Change vs theme and set background picture
6.函数的递归
5. Function recursion exercise
TYUT太原理工大学2022软工导论考试题型大纲
View UI Plus 发布 1.1.0 版本,支持 SSR、支持 Nuxt、增加 TS 声明文件
IPv6 experiment