在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
相关推荐
### CAS原理详解 CAS(Central Authentication Service)是一种开放源代码的单点登录协议和服务实现,广泛应用于企业级应用系统中。其主要目的是提供一个统一的身份验证解决方案,使得用户只需要在一个地方进行登录...
#### CAS原理概览 CAS(Central Authentication Service)是一种单点登录(Single Sign-On,SSO)协议,旨在简化多应用环境下的用户身份验证过程。它通过引入中央认证服务器(CAS Server)的概念,为各个服务或应用...
总的来说,CAS原理涉及到的身份验证机制、TGT和ST的概念,以及Spring Webflow在实现登录流程中的作用,都是理解CAS工作方式的关键点。通过定制化Spring Webflow配置,开发者可以根据需求扩展或调整CAS的默认行为,以...
### Java CAS 原理分析 #### 一、概述 CAS(Compare and Swap)作为一种重要的同步机制,在多线程环境中发挥着关键作用。它能够帮助开发者实现无锁编程,提高程序运行效率。本文将深入剖析Java中CAS的基本原理及其...
**标题:“CAS原理与Java并发”** 在Java并发编程中,CAS(Compare and Swap,比较并交换)是一种无锁算法,广泛应用于多线程环境下的数据同步。它通过硬件指令来实现原子操作,提升了并发性能,同时避免了锁带来的...
CAS2.0普通模式及代理模式的动画演示过程,通过该演示,能够初步了解单点登录及cas原理
在TS流中,CAS原理主要体现在如何保护和传输加密密钥和授权信息。 Descriptor是PSI/SI表格中的一种语法结构,它被用来描述特定的信息,例如音视频编码、节目名称等。每个Descriptor都有一个Descriptor Tag字段,...
### CAS原理讲解 #### 一、引言与背景 CAS(Central Authentication Service)是一种开源的单点登录(Single Sign-On, SSO)协议及其实现,主要用于简化用户在多个应用程序和服务中的认证过程。它通过集中式的身份...
本文将深入探讨其中的关键概念,包括读写锁、可重入锁、CAS原理以及volatile关键字。 首先,我们来看读写锁。读写锁允许多个线程同时进行读操作,但在写操作时,只有一个线程能够获得锁。这种设计极大地提高了并发...
CAS 原理及分析.............
CAS 原理及分析..............
CAS 原理及分析................
CAS(Central Authentication Service)是SSO的一种实现,由Yale大学发起,现在是一个广泛使用的开源项目。SSO的主要目标是提高用户体验和安全性,减少用户记住多个账号和密码的压力,同时集中管理认证过程,便于...
Java原子操作CAS原理解析 Java原子操作CAS原理解析是Java并发编程中的一种机制,用于解决多线程并行情况下使用锁造成的性能损耗。CAS操作包含三个操作数——内存位置(V)、预期原值(A)、新值(B)。如果内存位置的...
这个资源页面很可能是为了详细讲解CAS框架的核心概念、工作原理以及实际应用。 CAS的核心目标是简化用户认证流程,允许用户在一个系统上登录后,无需再次验证即可访问其他支持CAS的系统。它通过一个中央认证服务器...
#### 二、CAS原理和协议 CAS提供了一种可靠的Web应用单点登录协议,其核心是一个中央认证服务器(CASServer),它负责处理所有认证请求,并且维护用户的登录状态。 1. **名词解释** - **ST(Service Ticket)**:...
二、CAS原理和协议 CAS的核心工作流程包括: 1. 用户尝试访问受保护的应用。 2. 应用服务器重定向用户到CAS Server进行身份验证。 3. 用户在CAS Server上输入凭证,如用户名和密码。 4. CAS Server验证成功后,生成...
CAS原理** CAS工作流程主要包括以下步骤: 1. 用户尝试访问受保护的应用。 2. 应用服务器重定向用户到CAS服务器进行身份验证。 3. 用户在CAS服务器上输入凭证(如用户名和密码)。 4. CAS验证用户凭证,如果成功...