当前位置:网站首页>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带来开销大的问题
边栏推荐
- C语言入门指南
- vector
- Quickly generate illustrations
- TYUT太原理工大学2022软工导论考试题型大纲
- Abstract classes and interfaces
- 3.输入和输出函数(printf、scanf、getchar和putchar)
- 初识C语言(上)
- 9. Pointer (upper)
- Questions and answers of "basic experiment" in the first semester of the 22nd academic year of Xi'an University of Electronic Science and technology
- IPv6 experiment
猜你喜欢
Counter attack of flour dregs: redis series 52 questions, 30000 words + 80 pictures in detail.
6.函数的递归
IPv6 experiment
View UI plus released version 1.2.0 and added image, skeleton and typography components
arduino+DS18B20温度传感器(蜂鸣器报警)+LCD1602显示(IIC驱动)
Wei Pai: the product is applauded, but why is the sales volume still frustrated
7. Relationship between array, pointer and array
Change vs theme and set background picture
更改VS主题及设置背景图片
魏牌:产品叫好声一片,但为何销量还是受挫
随机推荐
Arduino+ds18b20 temperature sensor (buzzer alarm) +lcd1602 display (IIC drive)
View UI Plus 发布 1.3.0 版本,新增 Space、$ImagePreview 组件
[中国近代史] 第九章测验
Data manipulation language (DML)
Voir ui plus version 1.3.1 pour améliorer l'expérience Typescript
抽象类和接口
View UI plus released version 1.3.0, adding space and $imagepreview components
(超详细二)onenet数据可视化详解,如何用截取数据流绘图
Atomic and nonatomic
3. Number guessing game
Application architecture of large live broadcast platform
Alibaba cloud microservices (I) service registry Nacos, rest template and feign client
Introduction and use of redis
3.猜数字游戏
One article to get UDP and TCP high-frequency interview questions!
System design learning (I) design pastebin com (or Bit.ly)
Implement queue with stack
Alibaba cloud microservices (II) distributed service configuration center and Nacos usage scenarios and implementation introduction
3. C language uses algebraic cofactor to calculate determinant
ROS machine voice