CAS算法和ABA的用法
发表于:2025-01-23 作者:千家信息网编辑
千家信息网最后更新 2025年01月23日,这篇文章主要介绍"CAS算法和ABA的用法",在日常操作中,相信很多人在CAS算法和ABA的用法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"CAS算法和ABA的用法"
千家信息网最后更新 2025年01月23日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 AtomicStampedReferenceatomicStampedReference = 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安全错误
数据库的锁怎样保障安全
我国网络安全的手抄报
软件开发公司有什么优惠政策
软件开发中的需求文档
维普数据库有哪些检索途径
安卓版数据库查看
湖北常见软件开发要多少钱
数据库 账户
专科计算机网络技术 动画
互联网金融科技公司的兴起
重庆翔民软件开发有限公司
洗衣店洗衣软件开发系统
停车场的数据库怎么写
服务器5w
软件开发人员考证
云服务器什么资料不能放
数据库镜像技术有啥
mapper查询数据库字段
安眠书店哪个服务器能看
软件开发的一些概念
软件开发技术报告书
软件开发毕业做软件测试
数据库客户订购登记
数据库表导出命令
便宜空间大的服务器
网络安全法宣传图版
网络安全概论讲课视频
央企服务器不能租
幼儿大班网络安全教育记录
json如何导入数据库中
湖州java软件开发自学步骤