1.是什么?
AQS是构建锁和同步器的框架,主要支持获取锁和释放锁,像ReentraintLock的底层就是基于AQS实现的。获取锁时如果是独占锁就会堵塞,阻塞了就会将该线程加入阻塞队列中等待,直到成功获得锁从队列中移除。释放锁时需要修改并唤醒其他被阻塞的线程。
2.原理
1.核心组成:加锁状态state,加锁线程exclusiveOwnerThread,和阻塞队列。
阻塞队列是采用CLH模型构成的先进先出的双向队列。(CLH指虚拟的双向队列,队列只存储节点之间的关联关系,不存储节点实例)
2.获取锁的过程:
线程首先CAS尝试改变state状态,如果成功由0变为1表示获取成功,将exclusiveOwnerThread设为当前线程名。
如果是可重入锁,那么可以再去获得这把锁,state会累加。
另一个线程也CAS改变state,失败了就去阻塞队列里。
3.释放锁:
将state递减直至为0则释放成功,将exclusiveOwnerThread设为null同时唤醒队列中的线程。
3.其他应用
可重入锁:Reentrantlock、ReentrantReadWriteLock
不可重入锁:Mutrx
同步器:Semaphore/countDownlatch/CyclicBarrier.
来源:oschina
链接:https://my.oschina.net/u/4527334/blog/4307865