06 CAS的原理和AQS

Posted lifeone

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了06 CAS的原理和AQS相关的知识,希望对你有一定的参考价值。

CAS的原理

CAS(compareAndSwap),比较交换,是一种无锁的原子算法。

Cas(value,expect,newValue),如果vaule和ecpect一样,就更新为newValue,否则什么也不做,返回false

实现原理

通过调用unsafe.compareAndSwapInt(this, valueOffset, expect, update),之后该方法中调用虚拟机中的本地方法和底层操作系统进行操作

Cas带来的问题

  • 循环时间太长

    如果长时间得不到锁,会进行不断的循环,给cpu带来非常大的开销

    解决方法:在JUC中限制了cas自旋的次数,例如BlockingQueue的SynchronousQueue
  • 只能保证一个共享变量的原子性
    对于多个共享变量,这能使用锁
  • ABA问题
    当原来的值为A,变成B,然后又变为A,那么Cas检查时会发现没有变化,实质上已经发生过变化,这就是ABA问题。
    解决方法:每次变化的时候加版本号,使用AtomicStampedReference

AQS

是实现自定义锁的一个辅助类,提供了获取锁和释放锁的功能模板。

排它锁 共享锁
acquire(int flag)
以独占的模式获取对象,忽略中断
acquireShared(int arg)
以共享模式获取对象,忽略中断
tryAcquire(arg)
试图以独占模式获取对象
tryAcquireShared(int arg)
试图以共享模式获取对象
release(int arg)
以独占模式释放对象
releaseShared(int arg)
以共享模式释放对象

jdk提供的锁

  • ReentrantLock(支持锁的重入、公平锁和非公平锁)
  • ReentrantReadWriteLock

    锁降级:线程获取到写锁后,进行了数据修改,不能直接释放写锁,应该先获取读锁在释放写锁,最后释放读锁。

以上是关于06 CAS的原理和AQS的主要内容,如果未能解决你的问题,请参考以下文章

CAS和AQS

Java中CAS 基本实现原理

Java技术专题「原理分析系列」深入分析CAS的工作原理

ReentrantLock的底层实现原理

深入浅出Java并发编程指南「原理分析篇」非常全面的的探索和分析AQS的基本原理和实现机制(道法器术篇)

Java技术之旅深度分析AQS的工作原理