`
tom_seed
  • 浏览: 318763 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

CAS知识点收录

 
阅读更多

线程阻塞非阻塞及原子量碰撞http://my.oschina.net/bairrfhoinn/blog/167071

 

CAS:Compare and Swap, 翻译成比较并交换

  • java.util.concurrent包完全建立在CAS之上的
  • java.util.concurrent包中借助CAS实现了区别于synchronized同步锁的一种乐观锁
  • Java中CAS主要由sun.misc.Unsafe实现,提供了硬件级别的原子操作
  • Java无法直接访问到操作系统底层(如系统硬件等),因此Java使用native方法来扩展Java程序的功能,具体实现使用c++

Unsafe中关于CAS比较常用的方法:boolean sun.misc.Unsafe.compareAndSwapXXX(Object arg0, long arg1, int arg2, int arg3);

有4个操作数,1.内存值;2.属性偏移量;3.旧的预期值;4.要修改的新值。当且仅当旧的预期值和内存值相同时,将内存值修改为新值,否则什么都不做。

注:compareAndSwapXXX是根据字段偏移量去修改对象的值,其中int是4个字节的偏移量,long是4个字节的偏移量,String是4个字节的偏移量。偏移量与硬件机器有关。

 

Unsafe对象获取:Unsafe的对象不能直接new,要通过反射去获取。以下是获取方法:

private static Unsafe getUnsafeInstance() throws Exception {
	Field theUnsafeInstance = Unsafe.class.getDeclaredField("theUnsafe");
	theUnsafeInstance.setAccessible(true);
	return (Unsafe) theUnsafeInstance.get(Unsafe.class);
}

参考资料:http://www.importnew.com/7844.html

 

以简单的AtomicInteger为例:

public class AtomicInteger extends Number implements java.io.Serializable {
    //...上略
    private static final Unsafe unsafe = Unsafe.getUnsafe();

    private volatile int value;

    public AtomicInteger(int initialValue) {
        value = initialValue;
    }

    public AtomicInteger() {}

    public final int get() {
        return value;
    }

    public final void set(int newValue) {
        value = newValue;
    }

    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);
    }

    //...下略
}
  • 使用volatile原语,保证线程间的数据是可见的(共享的)
  • unsafe.compareAndSwapInt利用JNI来完成CPU指令的操作,同时借助JNI来完成Java的非阻塞算法(一个线程的失败或者挂起不应该影响其他线程的失败或挂起的算法)

参考资料:http://www.blogjava.net/xylz/archive/2010/07/04/325206.html

 

其他资料:

用AtomicStampedReference解决ABA问题:http://blog.hesey.net/2011/09/resolve-aba-by-atomicstampedreference.html

并发-原子操作的实现原理(CPU层面上的说明):http://www.searchsoa.com.cn/showcontent_69238.htm

分享到:
评论

相关推荐

    cas 单点登录 解决方案.

    cas 单点登录 解决方案.

    struts2+cas单点登陆例子

    myEclipse下含源码,在struts2下集成cas实现单点登陆的例子,例子虽然简单,基本上反映出cas的工作原理!

    CAS单点登录(java)

    CAS单点登录CAS单点登录CAS单点登录CAS单点登录

    CAS单点登录操作文档

    CAS单点登录操作文档 CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目。CAS 具有以下特点: • 开源的企业级单点登录解决...

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

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

    禅道开源版集成CAS单点登录

    本文在已有的禅道集成CAS单点登录的客户端插件基础上进行的修改,因原有插件在我们的系统上调试无法成功,做了一些定制,环境如下: 1. CAS server 版本:4.0.0 2. 禅道开源版本: 9.6.3 3. 禅道CAS client 插件版本...

    CAS单点登录demo

    CAS单点登录的详细讲解文档,所需jar包和tomcat6,CAS Server和CAS Client

    CAS单点登录时序图.puml

    CAS单点登录时序图,UML源码

    CAS单点登录系统之java实现(part_1)

    资源列表(1:cas CAS Server,2:Cas_Client_One 授权系统,3:graduationDesign 用户组织管理系统,4:CAS单点登录论文.doc,5:CAS单点登录文献综述.doc,6:基于CAS的用户管理单点登录门户系统ppt.ppt)

    cas3.5.2单点登录文档详细配置

    本人亲自试验的cas单点登录配置,服务端用cas-server-3.5.2,客户端用cas-client-3.2.1,里边详细描述了具体每一步的配置过程及遇到的问题及异常,相信你也会碰到的,cas-client-3.2.1中需要修改一个java类的源代码...

    cas单点登录demo

    cas单点登录的例子程序,运行见说明

    .net cas单点登录

    。net的cas单点登录代码

    cas单点登录官方demo

    cas单点登录官方demo

    cas单点登录技术

    1 单点登录总体解决方案 2 CAS原理和协议 3 CAS安全性 4 CAS工作模式 5 系统设计方案 6 CAS关键技术 6.1 域名规范 6.2 中文用户登录提交时乱码 ...7 单点登录风险 ...9.3 TOMCAT中使用CAS实现单点登录LDAP方式

    CAS单点登录服务端部署包

    CAS 是 Central Authentication Service 的缩写 —— 中央认证服务,一种独立开放指令协议,是 Yale 大学发起的一个企业级开源项目,旨在为 Web 应用系统提供一种可靠的 SSO 解决方案。 CAS 支持以下特性: CAS v1, ...

    CAS单点登陆资料学习单点登陆

    CAS单点登陆资料CAS单点登陆资料包括配置步骤及JAR

    CAS单点登录

    cas单点登录war包,可以直接放到tomcat下面webapps

    CAS单点登录配置大全

    cas单点登录配置大全,包括服务端、java客户端、.net客户端和php客户端配置

    cas单点登出的3个类

    CAS单点登出问题及解决 二 (文章摘自笔者发在自己公司内部论坛的文章:谢绝转载)

    cas客户端集成单点登录代码

    cas客户端集成单点登录代码cas客户端集成单点登录代码cas客户端集成单点登录代码cas客户端集成单点登录代码cas客户端集成单点登录代码cas客户端集成单点登录代码

Global site tag (gtag.js) - Google Analytics