美文网首页
AQS类中的acquire()逻辑分析

AQS类中的acquire()逻辑分析

作者: 不积小流_无以成江海 | 来源:发表于2023-05-18 14:50 被阅读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

    相关文章

      网友评论

          本文标题:AQS类中的acquire()逻辑分析

          本文链接:https://www.haomeiwen.com/subject/innwsdtx.html