深入理解 AQS
特别说明
当前文章内容迁移中,如有问题,请提交 issues 谢谢 ~~
抽象队列同步器
AbstractQuenedSynchronizer
。是除了java
自带的synchronized
关键字之外的锁机制。
原理
如果请求的共享资源空闲,则将当前线程置位工作线程,共享资源设置为锁定状态。
如果请求的共享资源别占用,则使用一套阻塞等待,以及唤醒分配的锁机制。这个机制由 AQS 的 CLH 队列保证,即将暂时不使用的线程
放入队列中。
CLH(Craig,Landin,and Hagersten)队列是一个虚拟的双向队列,虚拟的双向队列即不存在队列实例,仅存在节点之间的关联关系。
AQS
就是基于CLH
队列,用volatile
修饰共享变量state
,线程通过CAS
去改变状态符,成功则获取锁成功,失败则进入等待队列,等待被唤醒。
实现了 AQS 的锁有:
- 自旋锁
- 互斥锁
- 读写锁
- 信号量
- 栅栏
AQS 通过调用 Unsafe 类的 CAS 来保证原子性。
AQS