JAVAEE进阶——CAS,ABA问题

文章目录

  • CAS
    • 什么是CAS
      • 如何理解CAS
        • CAS伪代码
    • CAS怎么实现的
    • CAS的应用
      • 实现自旋锁
    • CAS的ABA问题
      • 什么是ABA问题
    • ABA问题的解决

CAS

什么是CAS

CAS:全称是Compare and swap也就是比较并交换什么是比较并交换呢?我们来举个例子

假如说原内存中的数据是V,旧的预期值是A需要修改的值是B
首先比较A与V是否相等如果相等的话那就更改将B写入V
返回操作是否成功

如何理解CAS

CAS伪代码
   boolean CAS(address, expectValue, swapValue) {
if (&address == expectedValue) {&address = swapValue;return true;}return false;
}

上面就是一个CAS的伪代码。当然了上述代码中的操作不是原子的这只是一个伪代码。

CAS怎么实现的

CAS的应用

CAS可以用来实现原子类。比如说java中提供了Atomiclnteger类其中的getAndcrement相当于++操作。那么他内部的伪代码是怎么样的呢?


class testAtom{private int value;boolean CAS(int value,int oldvalue,int swapvalue){if(value==oldvalue){this.value=swapvalue;return true;}return false;}public testAtom(int value){this.value=value;}public int getAndcrement(){int oldvalue=value;while(CAS(value,oldvalue,oldvalue+1)==false){oldvalue=value;}return value;}public int getValue() {return value;}
}

他的一个逻辑思路是怎么样的呢?如下图
在这里插入图片描述
首先我们假设t1线程先开始当t1刚开始的oldvalue等于value的时候那么CAS中就可以进入if判断,if判断后进入修改了this.value的值然后返回了true从而导致value和oldvalue不再相等。于是当t2线程再次调用getAndcrement()的时候就会再次进入CAS中然后此时的value已经和oldvalue不相等了当不相等的时候就会再次执行while循环当循环再次执行的时候,CAS由于oldvalue被改成和value一样的值从而导致我们的if判断可以进入从而再次实现了++操作。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实现自旋锁

CAS实现更灵活的锁。获取更多的控制权

class SpinLock{private Thread oner=null;public void lock(){while(!CAS(this.oner,null,Thread.currentThread())){}}public void unlock(){this.oner=null;}
}

CAS的ABA问题

什么是ABA问题

ABA问题:假设存在两个线程有一个共享的变量叫做num初始值为1
接下来线程t1想使用CAS把这个变量修改成2;那么需要进行下面的这个操作

先读取num的值计入到oldnum中
使用CAS判定当前的num值是否为1如果是1那就使其变为2.

但是在t1线程执行这个操作的时候t2线程也有可能在做出行动。此时t2线程可能会将num修改成了2然后又修改成了1如下图
在这里插入图片描述

那么这时候可能就有疑问说那这个有什么关系呢?我们可以想象一下下面的情景。
假如说你有100块钱,然后你要去银行取走50。这时候当你取走五十的时候你的妈妈又给你的银行卡打了五十。那么这时候是不是就造成了ABA问题呢?我们来看一下。

首先num=100
然后创建了t1和t2:线程要从100中扣除50。这时候t1和t2都希望能将num从100改为五十。
这时候t1线程先进性比较发现此时的num和oldnum值相等因此执行了num=swapnum此时num由100变为了50
然后此时t2线程应该执行失败才对可是这时候你的老妈给你打了五十并且创建了线程将你的 num由50变为了100
这时候t2线程再去执行的时候就发现num=100然后就会再次修改将100改为五十。

ABA问题的解决

讲完了上面我们要知道ABA问题如何解决呢我们可以引入一个版本号让这个版本号初始值为0当num执行一次改变的时候我们让版本号++然后每次判断是否需要改变都是比较版本号来进行,这时候就可以做到避免上述的问题了。怎么实现请看上面。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/294158.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AR和VR如何改变客户体验?

How AR and VR are transforming customer experiences? How AR and VR are transforming customer experiences AR和VR如何改变客户体验 AR and VR technology was largely expedited by the past pandemic with at least 93.3 million and 58.9 million users r…

机器学习实战17-高斯朴素贝叶斯(GaussianNB)模型的实际应用,结合生活中的生动例子帮助大家理解

大家好,我是微学AI,今天给大家介绍一下机器学习实战17-高斯朴素贝叶斯(GaussianNB)模型的实际应用,结合生活中的生动例子帮助大家理解。GaussianNB,即高斯朴素贝叶斯模型,是一种基于概率论的分类算法,广泛应…

游戏引擎中的粒子系统

一、粒子基础 粒子系统里有各种发射器(emitter),发射器发射粒子(particle)。 粒子是拥有位置、速度、大小尺寸、颜色和生命周期的3D模型。 粒子的生命周期中,包含产生(Spawn)、与环…

如何提高图片的分辨率?dpi修改工具推荐

在调整分辨率之前,我们需要了解什么是dpi分辨率,简单来说,分辨率是指图像中包含的像素数量,分辨率越高,图像就越清晰,常见的分辨率包括72dpi、96dpi和300dpi等,在打印照片或者一些考试平台对图片…

【产品经理】全面解读“数字孪生”

理解数字孪生 随着互联网技术的深入发展,数字孪生被越来越多地提及,那么数字孪生到底是什么?数字孪生,翻译自英文“Digital Twin”,最早在2002年,被从事产品生命周期管理PLM的Michael Grieves教授&#xf…

MHA的实验部署

一、前期准备 准备四台虚拟机,一台主服务器,一台管理服务器,两台从服务器 在开始之前先要关闭所有服务器的防火墙,以免有一些麻烦 二、实际操作 2.1 配置主服务器 2.2 配置从服务器1和2 2.3 给主从服务器实现软链接 2.4 配置mysql…

JimuReport积木报表 v1.7.4 正式版本发布,免费的JAVA报表工具

项目介绍 一款免费的数据可视化报表,含报表和大屏设计,像搭建积木一样在线设计报表!功能涵盖,数据报表、打印设计、图表报表、大屏设计等! Web 版报表设计器,类似于excel操作风格,通过拖拽完成报…

JavaEE初阶-线程3

文章目录 一、线程安全问题-内存可见性二、等待通知2.1 wait()方法2.2 notify()方法 一、线程安全问题-内存可见性 import java.util.Scanner;public class Demo27 {private static int count0;//下面这段代码会出现内存的可见性问题//将从内存中读取count值的操作称为load 判…

OpenHarmony实战:代码上库

前言 到达这一步好比临门一脚,意义很大!您的代码被合入 OpenHarmony 平台,这是最后的一道关口,保证合入的是正确的,并且不会对系统造成意外。 避坑指南 1. 填写 ISSUE 和 PR 按照规范进行 ISSUE 和 PR 填写不规范会…

Redis中的复制功能(一)

复制 概述 在Redis中,用户可以通过执行SLAVEOF命令或者设置slaveof选项,让一个服务器去复制(replicate)另一个服务器,我们称呼被复制的服务器为主服务器(master),而对主服务器进行复制的服务器则被称为从服务器(slave),如图所示…

数据可视化-ECharts Html项目实战(9)

在之前的文章中,我们学习了如何在ECharts中编写气泡图,词云图。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢。 数据可视化-ECharts Ht…

【核心复现】同时考虑考虑孤岛与重构的配电网故障恢复运行策略

目录 主要内容 内容详情 1.问题引出 2.可控负荷 3.网络拓扑约束 4.算法流程 结果一览 1.原文结果 2.程序运行结果 下载链接 主要内容 该模型复现文章《同时考虑考虑孤岛与重构的配电网故障恢复运行策略》,以IEEE33配电网为分析对象,…

算法2.7:排序算法之间的比较

排序算法间的比较 比较元素: 1,平均时间复杂度 2,最好情况 3,最坏情况 4,空间复杂度 5,排序方式 6,稳定性 部分术语解释: 1,稳定:如果a本来在b前面,ab,排序之后a仍然在b前面 2,不稳定:即!第一条 3,内排序:所有排序操作都在内存中完成 4,外排序:需要借助外界的存储空…

js逆向之实例某宝热卖(MD5)爬虫

目录 正常写 反爬 逆向分析 关键字搜索 打断点&分析代码 得出 sign 的由来 确定加密方式 写加密函数了 补全代码 免责声明:本文仅供技术交流学习,请勿用于其它违法行为. 正常写 还是老规矩,正常写代码,该带的都带上,我这种方法发现数据格式不完整. 应该后面也是大…

利用优质样本提示,优化ChatGPT Prompt的编写技巧

在当下这个数字化高速发展的时代,大型语言模型(LLM)如ChatGPT等,已逐渐融入我们的日常生活与专业工作之中,成为不可或缺的得力助手。它们凭借强大的能力,不仅能回答我们的疑问,还能协助我们撰写…

分布式全闪占比剧增 152%,2023 年企业存储市场报告发布

近日,IDC 发布了 2023 年度的中国存储市场报告。根据该报告,在 2023 年软件定义存储的市场占比进一步扩大,分布式全闪的增长尤其亮眼,其市场份额从 2022 年的 7% 剧增到 2023 年的 17.7%,增长了 152%。 01 中国企业存…

Dual Relation Knowledge Distillation for Object Detection用于目标检测的双关系知识蒸馏

摘要 有两个关键点导致检测任务的蒸馏性能不佳。一是前景和背景特征严重不平衡,二是小对象缺乏足够的特征表示。为了解决上述问题,我们提出了一种新的知识蒸馏方法——双关系知识蒸馏(DRKD),包括逐像素关系蒸馏和逐实…

微信小程序实现左滑删除

效果 实现思路 使用的是官方提供的movable-area 嵌套movable-view 1、movable-area:注意点,需要设置其高度,否则会出现列表内容重叠的现象。 2、由于movable-view需要向右移动,左滑的时候给删除控件展示的空间,故 mov…

HarmonyOS 应用开发之ArkData

功能介绍 ArkData (方舟数据管理)为开发者提供数据存储、数据管理和数据同步能力,比如联系人应用数据可以保存到数据库中,提供数据库的安全、可靠以及共享访问等管理机制,也支持与手表同步联系人信息。 标准化数据定义…

C++ list

文章目录 list的介绍及使用list的介绍list的构造list iterator的使用list capacitylist element accesslist modifiers list模拟实现list节点类list迭代器类list类 list深度剖析list迭代器失效list反向迭代器 list与vector对比 list的介绍及使用 list的介绍 1.list的底层是双向…