在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁(后面的章节还会谈到锁)。
锁机制存在以下问题:
(1)在多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延时,引起性能问题。
(2)一个线程持有锁会导致其它所有需要此锁的线程挂起。
(3)如果一个优先级高的线程等待一个优先级低的线程释放锁会导致优先级倒置,引起性能风险。
volatile是不错的机制,但是volatile不能保证原子性。因此对于同步最终还是要回到锁机制上来。
独占锁是一种悲观锁,synchronized就是一种独占锁,会导致其它所有需要锁的线程挂起,等待持有锁的线程释放锁。而另一个更加有效的锁就是乐观锁。所谓乐观锁就是,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。
CAS 操作
上面的乐观锁用到的机制就是CAS,Compare and Swap。
CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。
非阻塞算法 (nonblocking algorithms)
一个线程的失败或者挂起不应该影响其他线程的失败或挂起的算法。
现代的CPU提供了特殊的指令,可以自动更新共享数据,而且能够检测到其他线程的干扰,而 compareAndSet() 就用这些代替了锁定。
拿出AtomicInteger来研究在没有锁的情况下是如何做到数据正确性的。
private volatile int value;
首先毫无以为,在没有锁的机制下可能需要借助volatile原语,保证线程间的数据是可见的(共享的)。这样才获取变量的值的时候才能直接读取。
public final int get() {
return value;
}
然后来看看++i是怎么做到的。
public final int incrementAndGet() {
for (;;) {
int current = get();
int next = current + 1;
if (compareAndSet(current, next))
return next;
}
}
在这里采用了CAS操作,每次从内存中读取数据然后将此数据和+1后的结果进行CAS操作,如果成功就返回结果,否则重试直到成功为止。
而compareAndSet利用JNI来完成CPU指令的操作。
public final boolean compareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}
整体的过程就是这样子的,利用CPU的CAS指令,同时借助JNI来完成Java的非阻塞算法。其它原子操作都是利用类似的特性完成的。
而整个J.U.C都是建立在CAS之上的,因此对于synchronized阻塞算法,J.U.C在性能上有了很大的提升。
CAS看起来很爽,但是会导致“ABA问题”。
CAS算法实现一个重要前提需要取出内存中某时刻的数据,而在下时刻比较并替换,那么在这个时间差类会导致数据的变化。
比如说一个线程one从内存位置V中取出A,这时候另一个线程two也从内存中取出A,并且two进行了一些操作变成了B,然后two又将V位置的数据变成A,这时候线程one进行CAS操作发现内存中仍然是A,然后one操作成功。尽管线程one的CAS操作成功,但是不代表这个过程就是没有问题的。如果链表的头在变化了两次后恢复了原值,但是不代表链表就没有变化。因此前面提到的原子操作AtomicStampedReference/AtomicMarkableReference就很有用了。这允许一对变化的元素进行原子操作。
转自:http://hi.baidu.com/qianjian21/item/073332713d5450285c1789b1
相关推荐
Java CAS原理深度分析
Java CAS 原理分析整理...Java CAS 原理分析整理...Java CAS 原理分析整理...Java CAS 原理分析整理...Java CAS 原理分析整理...Java CAS 原理分析整理...
CAS原理和配置过程.,轻轻松松搞定CAS配置。。。。。。。。
cas原理 webflow mvc ioc 登陆流程
cas原理.doc
CAS2.0普通模式及代理模式的动画演示过程,通过该演示,能够初步了解单点登录及cas原理
cas原理[归纳].pdf
CAS 原理及分析.............
CAS 原理及分析..............
CAS 原理及分析................
JUC最详细思维导图,一次了解读写锁,可重入锁,Cas原理,volatile 关键字原理
TS各个表 与 SECTION 的解析 CAS原理
条件接收系统CAS(Conditional Access System)是付费数字电视广播的核心技术,其主要功能是阻止非法入侵数字广播网络......
NULL 博文链接:https://xq0804200134.iteye.com/blog/1821524
以普度大学的CAS,讲解CAS基本原理,安装配置过程
CAS 原理和协议 从 结构上看,CAS 包含两个部分: CAS Server 和 CAS Client。CAS Server 需要独立部署,主要负责对用户的认证工作;CAS Client 负责处理对客户端受保护资源的访问请求,需要登录时,重定向到 CAS ...
CAS介绍资源页面 系列介绍了CAS框架原理及使用
CAS实现原理与例子CAS实现原理与例子CAS实现原理与例子CAS实现原理与例子CAS实现原理与例子CAS实现原理与例子CAS实现原理与例子CAS实现原理与例子CAS实现原理与例子CAS实现原理与例子
cas sso cas原理 sso原理
JAVA CAS原理深度分析,JAVA CAS原理深度分析,JAVA CAS原理深度分析,JAVA CAS原理深度分析,JAVA CAS原理深度分析,JAVA CAS原理深度分析