CAS算法和ABA的用法
发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章主要介绍"CAS算法和ABA的用法",在日常操作中,相信很多人在CAS算法和ABA的用法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"CAS算法和ABA的用法"
千家信息网最后更新 2026年10月31日CAS算法和ABA的用法
这篇文章主要介绍"CAS算法和ABA的用法",在日常操作中,相信很多人在CAS算法和ABA的用法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"CAS算法和ABA的用法"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
package com.shi.CAS;import java.util.concurrent.atomic.AtomicInteger;import java.util.concurrent.atomic.AtomicStampedReference;/** * ABA问题案例 * @author shiye * */public class ABATest1 { static AtomicInteger auAtomicInteger = new AtomicInteger(100); static AtomicStampedReference atomicStampedReference = new AtomicStampedReference<>(100,1); public static void main(String[] args) throws InterruptedException { System.out.println("===============ABA问题的产生==============="); new Thread(()-> { boolean a1 = auAtomicInteger.compareAndSet(100, 200); System.out.println(Thread.currentThread().getName() + a1 + " 第一次 修改之后的值为 " + auAtomicInteger.get()); boolean a2 = auAtomicInteger.compareAndSet(200, 100); System.out.println(Thread.currentThread().getName() + a2 + " 第二次 修改之后的值为 " + auAtomicInteger.get()); },"线程A ").start(); new Thread(()-> { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } boolean b1 = auAtomicInteger.compareAndSet(100, 2019); System.out.println(Thread.currentThread().getName() + b1 + " 第一次 修改之后的值为 " + auAtomicInteger.get()); },"线程B ").start(); Thread.sleep(3000); System.out.println("===============ABA问题的解决==============="); new Thread(()->{ int stamp1 = atomicStampedReference.getStamp();//获取版本 System.out.println(Thread.currentThread().getName() + "当前版本是: " + stamp1); try { Thread.sleep(1000);//睡眠1s } catch (InterruptedException e) { e.printStackTrace(); } boolean C1 = atomicStampedReference.compareAndSet(100, 499, stamp1, stamp1+1); System.out.println(Thread.currentThread().getName() + C1 + " 第一次 修改之后的值为 " + atomicStampedReference.getReference() + " 版本号为: " + atomicStampedReference.getStamp()); int stamp2 = atomicStampedReference.getStamp();//获取版本 boolean C2 = atomicStampedReference.compareAndSet(499, 100, stamp2, stamp2+1); System.out.println(Thread.currentThread().getName() + C2 + " 第二次 修改之后的值为 " + atomicStampedReference.getReference() + " 版本号为: " + atomicStampedReference.getStamp()); },"线程C ").start(); new Thread(()->{ int stamp1 = atomicStampedReference.getStamp();//获取版本 System.out.println(Thread.currentThread().getName() + "当前版本是: " + stamp1); try { Thread.sleep(3000);//睡眠3s } catch (InterruptedException e) { e.printStackTrace(); } boolean d1 = atomicStampedReference.compareAndSet(100, 2019, stamp1, stamp1+1); System.out.println(Thread.currentThread().getName() + d1 + " 第一次 修改之后的值为 " + atomicStampedReference.getReference() + " 版本号为: " + atomicStampedReference.getStamp()); },"线程D ").start(); }} 执行结果:
===============ABA问题的产生===============线程A true 第一次 修改之后的值为 200线程A true 第二次 修改之后的值为 100线程B true 第一次 修改之后的值为 2019===============ABA问题的解决===============线程C 当前版本是: 1线程D 当前版本是: 1线程C true 第一次 修改之后的值为 499 版本号为: 2线程C false 第二次 修改之后的值为 499 版本号为: 2线程D false 第一次 修改之后的值为 499 版本号为: 2
到此,关于"CAS算法和ABA的用法"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!
版本
线程
第一次
问题
算法
学习
更多
帮助
睡眠
实用
接下来
文章
方法
案例
理论
知识
篇文章
结果
网站
资料
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网是第几次科技革命的成果
美国互联网保险保险科技
互联网金融监管科技数据
互联网金融 科技金融
互联网科技网站
深圳艾佳互联网科技
大白互联网科技
海南科技产业互联网平台
互联网科技创新服务
上海宁丞科技互联网
玉溪互联网科技怎么选
健康食品互联网创新科技园项目
互联网新科技动漫ppt素材
华夏恒生互联网科技013171
深圳市罗太互联网科技有限公司
威龙国际互联网科技公司
互联网与数字科技关系
珠海东科互联网科技有限公司
黑龙江互联网科技公司
山东亿川互联网科技有限责任公司
互联网络科技
科技和互联网公司
没上市的科技互联网公司
网络科技有限互联网
金融科技 互联网金融
互联网金融科技公司的优势
互联网与数字科技关系
广州智享互联网科技
上海互联网科技园景观
互联网科技创业有什么好项目