首页 > 其他分享 >CAS

CAS

时间:2023-06-28 16:31:38浏览次数:20  
标签:ABA CAS 版本号 线程 内存 操作

CAS(Compare And Swap/Set),比较并交换-乐观锁机制-锁自旋,CAS算法的过程中是这样:它包含3个参数CAS(V,E,N)。V表示要更新的变量(内存值),E表示预期的值(旧的),N表示新值。当且仅当V值等于E值时,才会将V的值设为N,如果V值和E值不同,则说明已经有其他线程做了更新,则当线程什么都不做。最后,CAS返回当前V的真实值。

CAS操作是抱有乐观的态度进行的(乐观锁),它总是认为自己成功完成操作。当多个线程同时使用CAS操作一个变量时,只有一个会胜出,并成功更新,其余均会失败。失败的线程不会被挂起,仅是被告知失败,并且允许再次尝试,当然也允许失败的线程放弃操作。基于这样的原理,CAS操作即使没有锁,也可以发现其他对当前线程的干扰,并进行恰当的处理。

ABA问题

CAS会导致“ABA问题”。CAS算法实现了一个重要前提需要取出内存中某时刻的数据,而在下时刻比较并替换,那么在这个时间差类会导致数据的变化。

比如说一个线程one从内存位置V中取出A,这时候另一个线程two也从内存中取出A,并且two进行了一些操作变成了B,然后two又将V位置的数据变成A,这时候线程one进行CAS操作发现内存中仍然时A,然后one操作成功。尽管线程one的CAS操作成功,但是不代表这个过程是没有问题的。

部分乐观锁的实现是通过版本号(version)的方式来解决ABA问题,乐观锁每次在执行数据的修改操作时,都会带上一个版本号,一旦版本号和数据的版本号一致就可以执行操作并对版本号执行+1操作,否则就执行失败。因此每次操作的版本号都会随之增加,所以不会出现ABA问题,因为版本号只会增加不会减少。


标签:ABA,CAS,版本号,线程,内存,操作
From: https://blog.51cto.com/u_11315052/6573838

相关文章

  • c++中static_cast用法
    static_cast是指显性类型强制转换,如: 结果为a=120.和C语言学习时的显性意义一样,但是编译器会对此类型转换进行检查。另外还有另外3种转换:const属性用const_cast。基本类型转换用static_cast。多态类之间的类型转换用daynamic_cast。不同类型的指针类型转换用reinterprete......
  • 网络安全学习篇37_第二阶段_基本Linux脚本、变量、判断if、循环for\while、case语句
    上一篇博客:网络安全学习篇36_第二阶段_简单介绍JavaWeb框架之Tomcat服务、Nginx负载均衡、Linux包过滤防火墙IPtables、NAT网络地址转换目录shell脚本变量数值读入if判断语句for、while循环语句case语句开始shell脚本1.脚本的作用:可以执行计划任务把需要执行的代码保存在一个文件......
  • C++面试八股文:static_cast了解一下?
    C++面试八股文:static_cast了解一下?某日二师兄参加XXX科技公司的C++工程师开发岗位第20面:面试官:C++中支持哪些类型转换?二师兄:C++支持C风格的类型转换,并在C++11引入新的关键字规范了类型转换。二师兄:C++11引入四种新的类型转换,分别是static_cast、dynamic_cast、const_cast......
  • CAS SSO单点登录基础实践,配置CAS 服务器和CAS客户端
    参考网址:http://www.ibm.com/developerworks/cn/opensource/os-cn-cas/index.html 到CAS官方网站下载CASServer和Client,地址分别为:http://www.ja-sig.org/downloads/cas/cas-server-3.1.1-release.ziphttp://www.ja-sig.org/downloads/cas-clients/cas-client-java-3.0.0.z......
  • CAS SSO配置
    基于CAS+Tomcat配置SSO一、系统配置casserver3.1.1casclient2.1.1tomcat5.5二.Tomcat配置,启用SSLa.在要安装CAS的机器上为Tomcat生成用于SSL通讯的密钥:%JAVA_HOME%/bin/keytool-genkey-aliastomcat-keyalgRSA这时需要输入密钥密码和其他参数(第一个参数CN必须设置为CAS机......
  • 状态机编程实例-嵌套switch-case法
    嵌入式软件开发中,状态机编程是一个比较实用的代码实现方式,特别适用于事件驱动的系统。本篇,以一个炸弹拆除的小游戏为例,介绍状态机编程的思路。C/C++语言实现状态机编程的方式有很多,本篇先来介绍最简单最容易理解的switch-case方法。1状态机实例介绍1.1炸弹拆除游戏如下是一个自制......
  • Linux扩展篇-shell编程(五)-流程控制(二)-case语句
    基本语法:case"${item}"in1)echo"item=1";;2|3)echo"item=2oritem=3";;*)echo"default(noneofabove)";;esac注意事项:以case开始esac结尾case行尾必须为单词“in”,每......
  • 海量数据运维要给力,华为云GaussDB(for Cassandra)来助力
    应用运维管理平台(AOM)和Cassandra是两个不可分割的组成部分,它们共同构成了一个高效的解决方案,可以帮助企业在应用运维业务上取得巨大的优势。在这篇文章中,我们将介绍AOM和Cassandra的优势和特点,揭晓它们如何为企业保持市场竞争力的秘密。导读随着容器技术的普及,越来越多的企业通过微......
  • 锁(case篇)
    case1(表锁的读-写-读阻塞)上篇文档中提到过WRITElocksnormallyhavehigherprioritythanREADlockstoensurethatupdatesareprocessedassoonaspossible.ThismeansthatifonesessionobtainsaREADlockandthenanothersessionrequestsaWRITElock,su......
  • Luogu P4720 【模板】扩展卢卡斯定理/exLucas
    【模板】扩展卢卡斯定理/exLucas题目背景这是一道模板题。题目描述求\[{\mathrm{C}}_n^m\bmod{p}\]其中\(\mathrm{C}\)为组合数。输入格式一行三个整数\(n,m,p\),含义由题所述。输出格式一行一个整数,表示答案。样例#1样例输入#1533样例输出#11样例#2......