理会CAS和CAS:
有时候面试官面试问你的时候,会问,谈谈你对CAS的理解,这时应该有很多人,就会比较懵,当然,我也会比较懵,当然我和很多人的懵不同,很多人可能,并不知道CAS是一个什么东西,而在我看来我是不知道他问的是那个CAS
我一般会问面试官,问他问的CAS是"原子操作",还是"单点登录"
因为在JAVA并发中的原子操作是称为CAS的,也就是英文单词CompareAndSwap的缩写,中文意思是:比较并替换。
但是在企业应用中CAS也被称为企业级开源单点登录解决方案,是 Central Authentication Service 的缩写 —— 中央认证服务,一种独立开放指令协议,是 Yale 大学发起的一个企业级开源项目,旨在为 Web 应用系统提供一种可靠的 SSO 解决方案。
CAS(Compare And Swap):
我们先要学习的是并发编程中的CAS,也就是原子操作
那么,什么是原子操作?如何实现原子操作?
什么是原子操作:
原子,也是最小单位,是一个不可再分割的单位,不可被中断的一个或者一系列操作
CAS是以一种无锁的方式实现并发控制,在实际情况下,同时操作一个对象的概率非常小,所以多数加锁操作做的基本是无用功
CAS以一种乐观锁的方式实现并发控制
如何实现原子操作:
Java可以通过锁和循环CAS的方式实现原子操作
为什么要有CAS:
CAS就是比较并且替换的一个原子操作,在CPU的指令级别上进行保证
为什么要有CAS:
Sync是基于阻塞的锁的机制,
1:被阻塞的线程优先级很高
2:拿到锁的线程一直不释放锁则么办
3:大量的竞争,消耗CPU,同时带来死锁或者其他线程安全
因为通过锁实现原子操作时,其他线程必须等待已经获得锁的线程运行完车之后才能获取锁,这样就会占用系统大量资源
CAS原理:
从CPU指令级别保证这是一个原子操作
CAS包含哪些参数:
三个运算符:
一个内存地址V
一个期望的值A
一个新值B
基本思路:
如果地址V上的值和期望的值A相等,就给地址V赋值新值B,如果不是,不做任何操作
循环CAS:
在一个(死)循环中[for(;;)]里不断进行CAS操作,直到成功为止(自旋操作即死循环)
CAS问题:
ABA问题:
那么什么是ABA问题?就是内存中原本是A,然后通过CAS变成了B,然后再次通过CAS变成了A,这个过程中,相对于结果来说,是没有任何改变的,但是相对于内存来说,至少发生过两次变化,这就是ABA问题
生活中:
就像你接了一杯水,这时水是满的,但是这个时候,你的同时很渴,过来拿你的水直接喝掉了一半,这时水剩下了一半,接着,你的同事又重新把你的水帮你接满了,那么这时你的水还是满的,相对于水来说,他还是满的,但是相对于杯子来说,他已经被用过了两次,一次是喝水,一次是接水,这就是ABA问题
从Java1.5开始JDK的atomic包里提供了一个类AtomicStampedReference来解决ABA问题。这个类的compareAndSet方法作用是首先检查当前引用是否等于预期引用,并且当前标志是否等于预期标志&#