线程阻塞非阻塞及原子量碰撞: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 单点登录 解决方案.
myEclipse下含源码,在struts2下集成cas实现单点登陆的例子,例子虽然简单,基本上反映出cas的工作原理!
CAS单点登录CAS单点登录CAS单点登录CAS单点登录
CAS单点登录操作文档 CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目。CAS 具有以下特点: • 开源的企业级单点登录解决...
基于Java中CAS的单点登录,有服务端的所有源码,将tomcat目录下的所有资源直接拷到Tomcat服务中间件的webapp目录下,阅读tomcat-webapp中的read.txt文档,查看使用说明,适用于第一次开发CAS单点登录的同学们,简单...
本文在已有的禅道集成CAS单点登录的客户端插件基础上进行的修改,因原有插件在我们的系统上调试无法成功,做了一些定制,环境如下: 1. CAS server 版本:4.0.0 2. 禅道开源版本: 9.6.3 3. 禅道CAS client 插件版本...
CAS单点登录的详细讲解文档,所需jar包和tomcat6,CAS Server和CAS Client
CAS单点登录时序图,UML源码
资源列表(1:cas CAS Server,2:Cas_Client_One 授权系统,3:graduationDesign 用户组织管理系统,4:CAS单点登录论文.doc,5:CAS单点登录文献综述.doc,6:基于CAS的用户管理单点登录门户系统ppt.ppt)
本人亲自试验的cas单点登录配置,服务端用cas-server-3.5.2,客户端用cas-client-3.2.1,里边详细描述了具体每一步的配置过程及遇到的问题及异常,相信你也会碰到的,cas-client-3.2.1中需要修改一个java类的源代码...
cas单点登录的例子程序,运行见说明
。net的cas单点登录代码
cas单点登录官方demo
1 单点登录总体解决方案 2 CAS原理和协议 3 CAS安全性 4 CAS工作模式 5 系统设计方案 6 CAS关键技术 6.1 域名规范 6.2 中文用户登录提交时乱码 ...7 单点登录风险 ...9.3 TOMCAT中使用CAS实现单点登录LDAP方式
CAS 是 Central Authentication Service 的缩写 —— 中央认证服务,一种独立开放指令协议,是 Yale 大学发起的一个企业级开源项目,旨在为 Web 应用系统提供一种可靠的 SSO 解决方案。 CAS 支持以下特性: CAS v1, ...
CAS单点登陆资料CAS单点登陆资料包括配置步骤及JAR
cas单点登录war包,可以直接放到tomcat下面webapps
cas单点登录配置大全,包括服务端、java客户端、.net客户端和php客户端配置
CAS单点登出问题及解决 二 (文章摘自笔者发在自己公司内部论坛的文章:谢绝转载)
cas客户端集成单点登录代码cas客户端集成单点登录代码cas客户端集成单点登录代码cas客户端集成单点登录代码cas客户端集成单点登录代码cas客户端集成单点登录代码