CAS原子操作

如果面试官问你CAS的理解,首先要确定是他问的是“原子操作”还是“单点登录”。因为在企业应用中CAS也被称为企业级开源单点登录解决方案,是 Central Authentication Service 的缩写 —— 中央认证服务,一种独立开放指令协议,是 Yale 大学发起的一个企业级开源项目,旨在为 Web 应用系统提供一种可靠的 SSO 解决方案。

一般问的是“原子操作”。CAS(Compare And Swap):原子,也是最小单位,是一个不可再分割的单位,不可被中断的一个或者一系列操作。CAS是以一种无锁的方式实现并发控制,在实际情况下,同时操作一个对象的概率非常小,所以多数加锁操作做的基本是无用功。CAS以一种乐观锁的方式实现并发控制。

Sync是基于阻塞的锁机制。它的特点和缺点:1.被阻塞的线程优先级很高;2.拿到锁的线程一直不释放锁则么办; 3.大量的竞争,消耗CPU,同时带来死锁或者其他线程安全。鉴于以上问题,使用CAS比较高效。

java中实现原子操作通过锁和循环CAS的方式实现原子操作。CAS就是比较并且替换的一个原子操作,在CPU的指令级别上进行保证。参数包含:一个内存地址V,一个期望的值A,一个新值B。

基本思路: 如果地址V上的值和期望的值A相等,就给地址V赋值新值B,如果不是,不做任何操作。

  循环CAS:在一个(死)循环中[for(;;)]里不断进行CAS操作,直到成功为止(自旋操作即死循环)。

CAS问题:

  ABA问题:那么什么是ABA问题?就是内存中原本是A,然后通过CAS变成了B,然后再次通过CAS变成了A,这个过程中,相对于结果来说,是没有任何改变的,但是相对于内存来说,至少发生过两次变化,这就是ABA问题。从Java1.5开始JDK的atomic包里提供了一个类AtomicStampedReference来解决ABA问题。

开销问题:

    在自旋或者死循环中不断进行CAS操作,但是长期操作不成功,CPU不断的循环,带来的开销问题。解决:CPU提供pause指令。

CAS的目的:

  利用CPU的CAS指令,同时借助JNI来完成Java的非阻塞算法。其它原子操作都是利用类似的特性完成的。而整个J.U.C都是建立在CAS之上的,因此对于synchronized阻塞算法,J.U.C在性能上有了很大的提升。

参考链接:https://www.cnblogs.com/flower-dance/p/13767956.html

你可能感兴趣的:(CAS原子操作)