`
bjmike
  • 浏览: 283019 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

CAS原理(转)

 
阅读更多

在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://www.blogjava.net/syniii/archive/2010/11/18/338387.html?opt=admin
分享到:
评论

相关推荐

    CAS原理和配置过程

    ### CAS原理详解 CAS(Central Authentication Service)是一种开放源代码的单点登录协议和服务实现,广泛应用于企业级应用系统中。其主要目的是提供一个统一的身份验证解决方案,使得用户只需要在一个地方进行登录...

    cas原理 webflow mvc ioc

    #### CAS原理概览 CAS(Central Authentication Service)是一种单点登录(Single Sign-On,SSO)协议,旨在简化多应用环境下的用户身份验证过程。它通过引入中央认证服务器(CAS Server)的概念,为各个服务或应用...

    Java CAS 原理分析

    ### Java CAS 原理分析 #### 一、概述 CAS(Compare and Swap)作为一种重要的同步机制,在多线程环境中发挥着关键作用。它能够帮助开发者实现无锁编程,提高程序运行效率。本文将深入剖析Java中CAS的基本原理及其...

    cas原理.doc

    总的来说,CAS原理涉及到的身份验证机制、TGT和ST的概念,以及Spring Webflow在实现登录流程中的作用,都是理解CAS工作方式的关键点。通过定制化Spring Webflow配置,开发者可以根据需求扩展或调整CAS的默认行为,以...

    CAS实现原理与例子

    "CAS实现原理与例子" CAS(Central Authentication Service,中央认证服务)是一种单点登录(Single Sign-On,SSO)机制,允许用户在访问不同的应用系统时,只需要输入一次用户名和密码。CAS实现原理与例子主要包括...

    cas单点才登出原理

    接下来,我们将详细探讨CAS单点登出的原理。 首先,理解SSO的基本流程: 1. 用户打开一个受CAS保护的应用系统A。 2. 应用系统A发现用户未登录,重定向到CAS服务器。 3. 用户在CAS服务器上输入凭证并验证通过。 4. ...

    CAS的原理分析

    CAS的原理分析

    CAS 原理讲解

    ### CAS原理讲解 #### 一、引言与背景 CAS(Central Authentication Service)是一种开源的单点登录(Single Sign-On, SSO)协议及其实现,主要用于简化用户在多个应用程序和服务中的认证过程。它通过集中式的身份...

    Cas原理分析及协议详述

    CAS2.0普通模式及代理模式的动画演示过程,通过该演示,能够初步了解单点登录及cas原理

    CAS SSO 原理

    综上所述,CAS SSO原理是通过中心化的认证服务器和分散的客户端协同工作,实现了用户只需一次登录即可访问多个应用系统的功能。这种设计既方便了用户,又简化了系统管理员的身份管理,同时保持了一定的安全性。然而...

    CAS原理 java 并发

    **标题:“CAS原理与Java并发”** 在Java并发编程中,CAS(Compare and Swap,比较并交换)是一种无锁算法,广泛应用于多线程环境下的数据同步。它通过硬件指令来实现原子操作,提升了并发性能,同时避免了锁带来的...

    cas认证原理[参考].pdf

    【CAS认证原理】 单点登录(SSO,Single Sign-On)是一种网络认证机制,它允许用户在访问多个相互关联的应用系统时,只需登录一次即可。SSO的主要目标是简化用户体验,减少用户记忆和输入多次凭证的繁琐过程。CAS...

    cas认证原理

    CAS认证原理 单点登录概述 单点登录(Single Sign-On,简称SSO)是指用户在访问多个相关应用系统时,只需要登录一次即可访问所有相互信任的应用系统的解决方案。在SSO环境下,用户不需要重复提供凭证信息(如用户名...

    CAS 原理及分析part2

    CAS 原理及分析.............

    CAS 原理及分析part3

    CAS 原理及分析..............

    CAS 原理及分析part1

    CAS 原理及分析................

    CAS介绍资源页面

    这个资源页面很可能是为了详细讲解CAS框架的核心概念、工作原理以及实际应用。 CAS的核心目标是简化用户认证流程,允许用户在一个系统上登录后,无需再次验证即可访问其他支持CAS的系统。它通过一个中央认证服务器...

    CAS实现sso单点登录原理

    "CAS实现sso单点登录原理" CAS(Central Authentication Service)是Yale大学发起的一个企业级的、开源的项目,旨在为Web应用系统提供一种可靠的单点登录解决方法(属于Web SSO)。CAS开始于2001年,并在2004年12月...

Global site tag (gtag.js) - Google Analytics