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

java cas

    博客分类:
  • java
 
阅读更多

 

CPU原语-比较并交换(CompareAndSet),实现非阻塞算法


什么是CAS?
cas是现代CPU提供给并发程序使用的原语操作. 不同的CPU有不同的使用规范.

在 Intel 处理器中,比较并交换通过指令的 cmpxchg 系列实现。
PowerPC 处理器有一对名为“加载并保留”和“条件存储”的指令,它们实现相同的目地;
MIPS 与 PowerPC 处理器相似,除了第一个指令称为“加载链接”。

CAS 操作包含三个操作数 —— 内存位置(V)、预期原值(A)和新值(B)

什么是非阻塞算法?
一个线程的失败或挂起不应该影响其他线程的失败或挂起.这类算法称之为非阻塞(nonblocking)算法

对比阻塞算法:
如果有一类并发操作, 其中一个线程优先得到对象监视器的锁, 当其他线程到达同步边界时, 就会被阻塞.
直到前一个线程释放掉锁后, 才可以继续竞争对象锁.(当然,这里的竞争也可是公平的, 按先来后到的次序)

CAS 原理:

我认为位置 V 应该包含值 A;如果包含该值,则将 B 放到这个位置;否则,不要更改该位置,只告诉我这个位置现在的值即可

 

CAS使用示例(jdk 1.5 并发包 AtomicInteger类分析:)

    /**
     * Atomically sets to the given value and returns the old value.
     *
     * @param newValue the new value
     * @return the previous value
     */
    public final int getAndSet(int newValue) {
        for (;;) {
            int current = get();
            if (compareAndSet(current, newValue))
                return current;
        }
    }

    public final boolean compareAndSet(int expect, int update) {
        return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
    }

这个方法是, AtomicInteger类的常用方法, 作用是, 将变量设置为指定值, 并返回设置前的值.
它利用了cpu原语compareAndSet来保障值的唯一性.

 

直接调用的是UnSafe这个类的compareAndSwapInt方法

 

 public final native boolean compareAndSwapInt(Object o, long offset,
                                                  int expected,
                                                  int x);

 

跟踪OpenJDK的源代码在hotspot\src\share\vm\prims\目录下可以找到unsafe.cpp

 

UNSAFE_ENTRY(jboolean, Unsafe_CompareAndSwapInt(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jint e, jint x))
  UnsafeWrapper("Unsafe_CompareAndSwapInt");
  oop p = JNIHandles::resolve(obj);
  jint* addr = (jint *) index_oop_from_field_offset_long(p, offset);
  return (jint)(Atomic::cmpxchg(x, addr, e)) == e;
UNSAFE_END

 

   Atomic类的cmpxchg方法

     hotspot\src\os_cpu\windows_x86\vm\目录的atomic_windows_x86.inline.hpp文件里

inline jint     Atomic::cmpxchg    (jint     exchange_value, volatile jint*     dest, jint     compare_value) {
  // alternative for InterlockedCompareExchange
  int mp = os::is_MP();
  __asm {
    mov edx, dest
    mov ecx, exchange_value
    mov eax, compare_value
    LOCK_IF_MP(mp)
    cmpxchg dword ptr [edx], ecx
  }
}

 

 

 

 

 

分享到:
评论

相关推荐

    JAVA CAS深度分析

    JAVA CAS 深度分析 JAVA CAS(Compare And Swap)是一种原子操作,用于在多线程环境中实现同步机制。CAS 通过将内存值 V、旧的预期值 A 和要修改的新值 B 进行比较,如果预期值 A 和内存值 V 相同时,将内存值 V ...

    Java CAS 原理分析

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

    java cas server 集成 java cas client 和 net client

    java cas server 集成 java cas client 和 net client 附带文档,问题解决方法,源码,jar包,包含技术有java cas,cfx,LDAP,net cas。核心在于集成了net client,,上传太小,不能传源码,有需要的加群。有兴趣的...

    java cas单点登录

    java cas单点登录,里面附带源码和文档,比较详细,如有不懂请加群87115896

    cas java cas java 实例

    CAS(Central Authentication Service)是Java开发的一个开源身份验证框架,主要功能是为多个应用系统提供统一的登录认证服务。在Java开发中,CAS扮演着重要角色,它简化了用户身份验证的过程,允许用户只需登录一次...

    cas4.2.7 实现其他系统和cas互相认证互信

    3. **集成CAS客户端库**:在外部系统中,需要集成CAS客户端库,如Java CAS Client、Spring Security CAS等,它们负责处理与CAS服务器的交互,包括重定向用户到CAS登录页面、接收和验证服务票证。 4. **配置客户端...

    基于Java集成CAS单点登录【接部署即可启用】

    基于Java中CAS的单点登录,有服务端的所有源码,将tomcat目录下的所有资源直接拷到Tomcat服务中间件的webapp目录下,阅读tomcat-webapp中的read.txt文档,查看使用说明,适用于第一次开发CAS单点登录的同学们,简单...

    java-cas客户端client安装包

    Java CAS 客户端是Java应用程序与中央认证服务(CAS)进行交互的一种工具,它使得在分布式环境中实现单点登录(Single Sign-On, SSO)成为可能。CAS 是一个开源项目,由耶鲁大学发起,旨在提供一种安全的Web身份验证...

    java-cas单点登录服务端

    单点登录(Single Sign On , 简称 SSO )是目前比较流行的服务于企业业务整合的解决...CAS Client 支持非常多的客户端(这里指单点登录系统中的各个 Web 应用),包括 Java, .Net, PHP, Perl, Apache, uPortal, Ruby 等。

    JAVA CAS实现原理与使用.docx

    Java并发编程中,CAS(Compare and Swap,比较并交换)是一种无锁算法,它提供了一种在多线程环境下更新共享变量的方式,避免了传统锁机制带来的诸多问题。在JDK 5之前,Java主要依赖`synchronized`关键字来保证线程...

    java-cas-client:Apereo Java CAS客户端

    Java Apereo CAS客户端介绍这是Java Apereo CAS客户端的官方主页。 客户端由一系列Servlet过滤器组成,这些过滤器适用于大多数基于Java的Web应用程序。 它还用作API平台,以编程方式与CAS服务器进行交互,以进行身份...

    cas-client-2.0.11.zip_cas client_cas-clie_cas-client-2._java CAS

    5. **集成应用**:将CAS客户端集成到Java应用中,通常需要修改Web应用的web.xml配置,添加CAS过滤器和监听器,确保在用户访问受保护的页面时能够触发SSO流程。 6. **安全性**:CAS客户端提供了一种安全的身份验证...

    CAS.rar_CAS_java CAS_sso_单点登陆 java_登陆

    首先,"CAS.rar"是一个包含所有相关资源的压缩文件,其中"cas-server-3.0.6.zip"是CAS服务器的源码和部署包,而"cas-client-java-2.1.1.zip"则是CAS客户端的Java实现。这两个组件是实现SSO的核心部分,服务器负责...

    sso/cas单点登录Java maven版 含服务端客服端

    总的来说,这个项目提供了Java环境下使用Maven构建的CAS SSO解决方案,可以帮助开发者快速搭建一套SSO环境,实现不同应用间的统一登录管理。通过理解服务端和客户端的工作原理以及配置方法,可以灵活地适应各种应用...

    Java CAS基本实现原理代码实例解析

    Java CAS基本实现原理代码实例解析 Java CAS(Compare And Swap,比较并交换)是 Java 中的一种并发机制,它可以实现原子性的操作。在 Java 中,CAS 是通过 java.util.concurrent.atomic 包来实现的,例如 ...

    Java CAS底层实现原理实例详解

    "Java CAS底层实现原理实例详解" Java CAS(Compare And Swap)是一种机制,用于解决多线程并行情况下使用锁造成性能损耗的问题。CAS 的概念是,比较并交换,解决多线程并行情况下使用锁造成性能损耗的一种机制。...

    java/android连接CAS登陆验证工具类

    用的java语言后台连接CAS登陆验证的工具类 特点: 1、无需修改CAS服务端的代码 2、能够自动获取ticket等参数值 3、这是一个工具类调用非常方便,不光适用于java也适用于android, 其他语言也可以参考,注释写的非常...

    cas单点登出的3个类

    2. **NewSingleSignOutFilter.java**:这是一个过滤器类,可能是对CAS官方提供的`SingleSignOutFilter`的优化或扩展。在Spring Security或者 CAS服务器的配置中,这类过滤器通常会被用来监听和处理HTTP的logout请求...

Global site tag (gtag.js) - Google Analytics