AQS类中的acquire()逻辑分析
2023-05-18 本文已影响0人
不积小流_无以成江海
1个线程调用了acquire方法后,会发生什么
1.首先会先执行一下 tryAcquire方法去尝试获取一下锁,如果获取失败,就把当前线程放入到等待队列的尾部
2.放入等待队列的尾部后,会调用acquireQueued方法,并传入刚创建的线程对象
3.在acquireQueued方法里面,会先获取当前节点的前驱节点
判断前驱节点是不是头节点,如果是,就把当前节点设置为head节点,返回false
如果不是头结点,就调用shouldParkAfterFailedAcquire方法判断当前节点是否需要挂起
4.判断是否需要挂起的逻辑:
获取当前节点的前驱节点,判断前驱的节点的waitStatus的值
如果waitStatus的值等于Signal,返回true,表示当前节点需要挂起
如果waitStatus的值 > 0,表示前驱节点取消了等待,就找前驱节点的前驱节点,判断他的waitStatus值,如果也是 > 0,就一直往前找,知道找到一个不是 大于0
的,然后将当前节点插入到该节点之后
如果waitStatus的值 == 0,或者 == -3的,表示当前线程需要被唤醒,但不需要立即挂起,然后修改前驱节点的状态为Signal,并返回false