CAS无锁策略
并发编程时,对于共享资源的使用需要确保绝对的安全性。除了利用锁机制之外,还有一种无锁的概念。所谓无锁,就是假定在并发情况下,对于共享资源的访问没有冲突,线程可以一直不停的运行,无需阻塞,如果产生冲突,则使用CAS算法确保安全性。Java在很多并发代码中都使用了这种算法。
CAS算法的核心参数如下:
compareAndSet(V,E,A)
V代码需要进行更新的变量;E代表预期值;A代表所要更新的值。
CAS的核心思想就是:当要对一个变量进行更新时,先取出该变量此时在内存中的实际值,与预期值进行比较。如果相等,则代表没有其他线程对其进行过修改,直接更新。如果不同,表示有其他线程修改过,此时有两种策略。一种是让CAS自旋,直到更新成功;另外表示当前线程更新失败,继续后续逻辑。大概示意图如下:

对于CAS自旋,有可能会出现长时间更新失败,浪费CPU性能的情况。JDK1.6以后,加入了适应性自旋的概念。即如果某个锁自旋时很少获得成功,那么会减少自旋次数。自旋次数的默认值是10次,可以使用参数-XX:PreBlockSpin来更改。
再说一下为什么CAS在更新变量值的时候不会受到其他线程的影响呢?会不会我在判断更新值与预期值相等,进行更新的过程中,变量被其他线程更新了呢?其实不会,因为CAS具有排它性,一次CAS是一个原子操作,是CPU源语级别。确保隔离性。
Java对于CAS是使用Unsafe类进行支持的。顾名思义,不安全,可以让程序员像C语言那样直接操纵内存指针。java.util.concurrent.atomic包下的类,都是使用CAS实现的。
ABA缺陷
不知道大家通过上面对CAS的介绍说明,看到了CAS算法的缺陷没有!
CAS本身会有ABA问题。举个例子,变量m = 10,我要把m更新为30。在我判断之前,有其他线程先把m更新到50,在从50更新到10。那么我进行 10 == 10的判断时,这时候我怎么确定m的值有没有被改过呢?这就是ABA问题了。
要解决这个问题,我们就需要在进行 10 == 10判断的时候,还需要有其他参照。Java中有一个类AtomicStampedReference,这个类除了维护变量值之外,还会维护一个时间戳。用于确定数值版本。
private static class Pair<T> {
        final T reference;
        final int stamp;
        private Pair(T reference, int stamp) {
            this.reference = reference;
            this.stamp = stamp;
        }
        static <T> Pair<T> of(T reference, int stamp) {
            return new Pair<T>(reference, stamp);
        }
    }
    private volatile Pair<V> pair;
用volatile关键字修饰的内部类。
看一下核心的compareAndSet()方法:
public boolean compareAndSet(V expectedReference,
V newReference,
int expectedStamp,
int newStamp) {
Pair<V> current = pair;
return
expectedReference == current.reference &&
expectedStamp == current.stamp &&
((newReference == current.reference &&
newStamp == current.stamp) ||
casPair(current, Pair.of(newReference, newStamp)));
}
可以看到除了比较数值之外,还会比较时间戳。
CAS无锁策略的更多相关文章
- (转载)java高并发:CAS无锁原理及广泛应用
		java高并发:CAS无锁原理及广泛应用 版权声明:本文为博主原创文章,未经博主允许不得转载,转载请注明出处. 博主博客地址是 http://blog.csdn.net/liubenlong007 ... 
- CAS无锁算法与ConcurrentLinkedQueue
		CAS:Compare and Swap 比较并交换 java.util.concurrent包完全建立在CAS之上的,没有CAS就没有并发包.并发包借助了CAS无锁算法实现了区别于synchroni ... 
- java并发:AtomicInteger 以及CAS无锁算法【转载】
		1 AtomicInteger解析 众所周知,在多线程并发的情况下,对于成员变量,可能是线程不安全的: 一个很简单的例子,假设我存在两个线程,让一个整数自增1000次,那么最终的值应该是1000:但是 ... 
- CAS无锁机制原理
		原子类 java.util.concurrent.atomic包:原子类的小工具包,支持在单个变量上解除锁的线程安全编程 原子变量类相当于一种泛化的 volatile 变量,能够支持原子的和有条件的读 ... 
- CAS无锁实现原理以及ABA问题
		CAS(比较与交换,Compare and swap) 是一种有名的无锁算法.无锁编程,即不使用锁的情况下实现多线程之间的变量同步,也就是在没有线程被阻塞的情况下实现变量的同步,所以也叫非阻塞同步(N ... 
- CAS无锁技术
		前言:关于同步,很多人都知道synchronized,Reentrantlock等加锁技术,这种方式也很好理解,是在线程访问的临界区资源上建立一个阻塞机制,需要线程等待 其它线程释放了锁,它才能运行. ... 
- 探索CAS无锁技术
		前言:关于同步,很多人都知道synchronized,Reentrantlock等加锁技术,这种方式也很好理解,是在线程访问的临界区资源上建立一个阻塞机制,需要线程等待 其它线程释放了锁,它才能运行. ... 
- CAS无锁操作
		https://coolshell.cn/articles/8239.html 主要讲的是<Implementing Lock-Free Queues>的论点,具体直接看论文最好.这里总结 ... 
- CAS无锁模式
		一.java内存模型:JMM 在内存模型当中定义一个主内存,所有声明的实例变量都存在于主内存当中,主内存的数据会共享给所有线程,每一个线程有一个块工作内存,工作内存当中主内存数据的副本当更新数据时,会 ... 
随机推荐
- bzoj5518 & loj3046 「ZJOI2019」语言   线段树合并+树链的并
			题目传送门 https://loj.ac/problem/3046 题解 首先问题就是问有多少条路径是给定的几条路径中的一条的一个子段. 先考虑链的做法. 枚举右端点 \(i\),那么求出 \(j\) ... 
- Java第二阶段笔记
			抽象类不能创建对象 抽象类可以有构造方法成员变量成员方法静态方法final修饰的方法(只能被子类调用,不能被重写)抽象方法(可以有0个或多个) 抽象方法不能有方法体,只能以:结尾,只能存在于抽象方法中 ... 
- $nextTick
			Vue 实现响应式并不是数据发生变化之后 DOM 立即变化,而是按一定的策略进行 DOM 的更新. $nextTick 是在下次 DOM 更新循环结束之后执行延迟回调,在修改数据之后使用 $nextT ... 
- PL/SQL  循环
			----PL/SQL基本循环语句 LOOP DECLARE x ; BEGIN LOOP dbms_output.put_line(x); x :; THEN exit; END IF; END LO ... 
- hud 4347 The Closest M Points(KD-Tree)
			传送门 解题思路 \(KD-Tree\)模板题,\(KD-Tree\)解决的是多维问题,它是一个可以储存\(K\)维数据的二叉树,每一层都被一维所分割.它的插入删除复杂度为\(log^2 n\),它查 ... 
- Nginx 禁止IP访问 只允许域名访问
			今天要在Nginx上设置禁止通过IP访问服务器,只能通过域名访问,这样做是为了避免别人把未备案的域名解析到自己的服务器IP而导致服务器被断网,从网络上搜到以下解决方案: Nginx的默认虚拟主机在用户 ... 
- 简易的Web自动化链接测试(Xenu)
			1.理解链接需要测试的测试点: [1] 要测试的链接页面是否存在 [2] 确定存在链接页面,然后就考虑跳转后的页面是不是对应需求的页面[3] 保证Web系统上没有孤立的页面(没有链接指向该页面) 2. ... 
- 台哥原创:java 俄罗斯方块源码
			大四的时候,用java开发,耗时一周 界面参照当时用的联想手机里的俄罗斯方块  这里的级别,标识难度,1是初级,方块下降速度很慢,5是最高级,下降速度最快  得分:每消除一行,会给10分,同时消除 ... 
- Tomcat GC参数详解
			tomcat启动参数,将JVM GC信息写入tomcat_gc.log CATALINA_OPTS='-Xms512m -Xmx4096m -XX:PermSize=64M -XX:MaxNewSiz ... 
- .Net-WCF-图书:《WCF编程》
			ylbtech-.Net-WCF-图书:<WCF编程> <WCF编程>是2008年1月机械工业出版社出版的图书,作者是Juval Lowy.Clemens Vasters. 1 ... 
