CAS简介
概念
CAS(Compare And Swap 比较并交换),是 乐观锁 的一种典型实现机制。
乐观锁主要的两个步骤:冲突检测、数据更新。
当多个线程尝试使用CAS同时更新通过一个变量的时候,只有一个线程可以更新变量的值,其他线程都会失败,失败的线程不会被挂起,而是告知失败并可以再次尝试。
CAS操作包括3个操作数:需要读写的内存位置(V)、预期原值(A)、新值(B)。
如果内存位置与预期原值的A匹配,那么内存位置会更新为新值B;
如果内存位置与预期原值的值不匹配,那么处理器不会做任何操作;
无论何种情况,它都会在CAS指令之前返回该位置的值。
缺陷
1.ABA问题
现有一个单向链表实现的堆栈,栈顶为A,A.next为B
线程one希望通过CAS将栈顶A替换为B:head.compareAndSet(A, B); 执行此命令前,线程two介入,将A,B出栈,然后push D、C、A,此时栈结构如下:
对象B此时处于游离状态,轮到线程one执行CAS操作,检测发现栈顶仍为A,所以CAS成功,栈顶变成B,但是实际上B.next 是null,所以这时的情况为:
解决方法:而B成为了只有1个元素的堆栈,C和D组成的链表就不再存在于此堆栈中,也就是被丢掉了。
jdk 1.5开始atomic包提供了类AtomicStampedReference来解决ABA问题。
AtomicStampedReference的compareAndSet方法首先就检测当前引用是否等于预期引用,并且当前标志是否等于预期标志,如果全部相等,则以原子的方式将该引用和该标志的值设置给指定的更新值。
2.循环时间长开销大
自旋CAS(不成功,就一直循环执行,直至成功)如果长时间不成功,会给CPU带来极大的开销。
3.只能保证一个共享变量的原子操作
当只对1个变量执行操作时,可以使用循环CAS的方式保证原子操作,但是多个共享变量操作时,循环CAS就无法保证操作的原子性。
解决方法可以使用锁,但也有一个取巧的方法,就是多个共享变量合并成1个共享变量操作。
CAS简介的更多相关文章
- CAS 之 Apereo CAS 简介(一)
CAS 之 Apereo CAS 简介(一) Background(背景) 随着公司业务的不断扩展,后台接入子系统不断增多,那么我们将针对不同的平台进行拆分为各自对应的子系统, 权限是不变的,那么我们 ...
- CAS简介和无锁队列的实现
Q:CAS的实现 A:gcc提供了两个函数 bool __sync_bool_compare_and_swap (type *ptr, type oldval, type newval, ...)// ...
- 单点登录之CAS简介
cas官网http://www.ja-sig.org/products/cas/. ok,如今開始本文的重点内容解说,先来了解一下cas 实现single sign out的原理,如图所看到的: ...
- 并发和多线程(二)--线程安全、synchronized、CAS简介
线程安全性: 当多个线程访问一个类的时候,这个类始终表示出正确的行为,那么这个类是线程安全的. 无状态的对象一定是线程安全的,例如大部分service.dao.Servlet都是无状态的. 线程安全体 ...
- Cas简介(一)
Cas的全称是Centeral Authentication Service,是对单点登录SSO(Single Sign On)的一种实现.其由Cas Server和Cas Client两部分组成,C ...
- CAS单点登录系统简介
一.cas简介 全名:Central Authentication Service特点: 1.开源的.多协议的 SSO 解决方案: Protocols : Custom Protocol . CAS ...
- CAS学习笔记(一)
近期做单点登录,看了一些CAS资料,做下总结 一.cas简介 全名:Central Authentication Service 特点: 1.开源的.多协议的 SSO 解决方案: Protocols ...
- CAS实现SSO单点登录原理
1. CAS 简介 1.1. What is CAS ? CAS ( Central Authentication Service ) 是 Yale 大学发起的一个企业级的.开源的项目,旨 ...
- 单点登录系统CAS筹建及取得更多用户信息的实现
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
随机推荐
- jzoj6094
题目描述 给定一个循环流(每个点均满足流量平衡条件),这个循环流有$n$个点,且每条边的流量只有 $1$ 或$ 2$,其中$a$条边流量为$1$,$b$条边流量为$2$,判断是否存在一个流满足上述条件 ...
- geos编译问题
gdal编译geos的时候会用到geos_c_i.lib这个文件,我用cmake编译的时候仅仅产生geos_c.lib这个文件,所以只能使用nmake的编译方式来编译geos库,nmake编译geos ...
- 大牛针对零基础入门c语言详解指针(超详细)
C语言指针说难不难但是说容易又是最容易出错的地方,因此不管是你要做什么只要用到C指针你就跳不过,今天咱们就以 十九个例子来给大家简单的分析一下指针的应用,最后会有C语言视频资料提供给大家更加深入的参考 ...
- sort方法和自定义比较器的写法
摘要 在做一些算法题时常常会需要对数组.自定义对象.集合进行排序. 在java中对数组排序提供了Arrays.sort()方法,对集合排序提供Collections.sort()方法.对自定义对象排序 ...
- 洛谷 P3147 [USACO16OPEN]262144 P
链接: P3147 P3146双倍经验 前言: 今天发现的一道很有意思的DP题 分析: 第一眼以为是区间DP,于是设f[i][j]为从第i个数到第j个数可以合出的最大值,但思考后发现并不能简单合并,并 ...
- linux c语言 rename的用法-rename() does not work across different mount points, even if the same file system is mounted on both
最近在一个项目上执行文件的搬移功能时发现总是失败,临时录像文件存放于emmc的/tmp/目录下,当录像完成时候则调用rename企图将此文件搬到/mnt/sdcard/mmcblk1p1/(这是外置的 ...
- 一步一步学ROP之linux_x86篇(蒸米spark)
目录 一步一步学ROP之linux_x86篇(蒸米spark) 0x00 序 0x01 Control Flow Hijack 程序流劫持 0x02 Ret2libc – Bypass DEP 通过r ...
- 在纯JaveScript中实现报表导出:从“PDF”到“JPG”
我们在前端报表中完成了各种工作数据的输入或内容处理之后,需要做什么? 数据的导出! 这些数据的常用导出格式有:PDF.Excel.HTML和图片几大类型. 但总有一些实际应用场景,需要的不仅仅是将现有 ...
- springboot使用之请求参数与基本注解
@PathVariable 作用:@PathVariable是spring3.0的一个新功能:接收请求路径中占位符的值,将URL中占位符参数{xxx}绑定到处理器类的方法形参中@PathVariabl ...
- PTA 根据后序和中序遍历输出先序遍历 (25分)
PTA 根据后序和中序遍历输出先序遍历 (25分) 本题要求根据给定的一棵二叉树的后序遍历和中序遍历结果,输出该树的先序遍历结果. 输入格式: 第一行给出正整数N(≤30),是树中结点的个数.随后两行 ...