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 (不写邀请码,没有现金送)国内私 ...
随机推荐
- LP-DDR 和其他 DDR
一篇技術文檔比較 LP-DDR 和其他 DDR. 就觀念來說,LP-DDR 就是 Low Power 的 DDR:但就架構來說,LP-DDR 和其他 DDR 是截然不同的東西. 他們分屬不同的 JDE ...
- Spring的Ioc与DI
一.前言 Spring框架的核心基于控制反转的原理. IoC是一种将组件依赖关系的创建和管理外部化的技术. 考虑一个示例,其中Foo类依赖于Bar类的实例来执行某种处理. 传统上,Foo使用new运算 ...
- 构建乘积数组 牛客网 剑指Offer
构建成绩数组 牛客网 剑指Offer 题目描述 给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]A[1]...*A[i-1]A[i ...
- Python Numpy matplotlib Histograms 直方图
import numpy as np import matplotlib.pyplot as plt mu,sigma = 2,0.5 v = np.random.normal(mu,sigma,10 ...
- ubuntn 一直循环登录界面 (卸载nvidia驱动)
由于在Ubuntu下安装了Nvidia显卡驱动后开机一直处于循环登录界面,密码输入正确也是进不去,然后就决定卸载Nvidia显卡驱动.首先是在能使用tty1登录的情况下,使用 $ sudo apt-g ...
- JAVA笔记2__类/封闭性/构造方法/方法的重载/匿名对象
public class Main { public static void main(String[] args) { Chicken c1 = new Chicken(); Chicken c2 ...
- Python展示文件下载进度条
前言 大家在用Python写一些小程序的时候,经常都会用到文件下载,对于一些较小的文件,大家可能不太在乎文件的下载进度,因为一会就下载完毕了. 但是当文件较大,比如下载chromedriver的时候, ...
- Spring Cloud Gateway实战之一:初探
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 关于<Spring Cloud Gateway实 ...
- 二.什么是Promise
二.什么是Promise 1.理解 2.promise 的状态改变 3.promise的基本流程 4.promise的基本使用 1.理解 抽象表达: Promise 是JS 中进行异步编程的新的解决方 ...
- SpringCloud config native 配置
1.概述 最近项目使用springCloud 框架,使用config搭建git作为配置中心. 在私有化部署中,出现很多比较麻烦的和鸡肋的设计. 每次部署都需要安装gitlab 有些环境安装完gitla ...