AQS原理探究
Posted 若曦`
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AQS原理探究相关的知识,希望对你有一定的参考价值。
(本文中部分图片来自阳哥AQS视频中的截图)
1. AQS简介
AQS全称 AbstractQueuedSynchronizer 抽象队列同步器,是JUC中最重要的基石部分,许多JUC工具包的Sync内部类都继承自AQS,,比如 ReentrantLock,CountDownLatch,Semaphore,CyclicBarrier(内部使用了ReentrantLock)等
一句话总结AQS
AQS就是一个并发包的基础组件,用来实现各种锁,各种同步组件的;它包含了state变量、加锁线程、等待队列等并发中的核心组件;
2. AQS原理初步探讨
- 如果int(state)是0则代表没有资源占用锁,如果是1则有占用;
node节点封装thread,实现锁的分配,通过CAS完成去State锁占用情况的修改
注意Thread是volatile修饰的
3. 从ReentrantLook解读AQS
(1) ReentrantLook与AQS的关系
调用ReentrantLock的lock()与unlock()时,实质是调用Sync的方法,如果获取不到锁,则封装成一个node节点存入AQS中
(2) 构造函数
(3) lock()方法
(4) acquire()方法
① tryAcquire()
该方法是为了一种情况,就是第二个线程没获取到锁的时候,先不急着入队,再使用CAS判断一次线程一是否还在,同时也是实现锁可重入的特性的步骤( 判断进入方法的要获取锁的线程是不是正持有锁的线程,如果是,那么就加重入锁)
② addWaiter()
EXCLUSIVE代表排它类型的
当等待队列为空时,第一个加入该队列的线程时的结果
后续再有线程加入队列的情况
(5) acquireQueued()方法
① shouldParkAfterFailedAcquire()方法
从名字就可以看出来,翻译为获取失败则应该停下,在该方法中使用了自旋,判断前驱节点的等待状态
② parkAndCheckInterrupt()
到这一步后,被阻塞的线程停歇了,乖乖的待在等待队列中。
以上是关于AQS原理探究的主要内容,如果未能解决你的问题,请参考以下文章