一些AQS相关的知识

状态变量state被volatile修饰,对其操作的方法包括tryAcquire、tryRelease等,都是通过CAS。

申请公平锁的线程,会先判断当前队列没有前驱节点在等待(也就是没有线程在等待)时才会CAS修改同步状态变量。而申请非公平锁的线程,则会无视队列,直接CAS抢锁,如果不成功,再进入到队列等待唤醒。1
上述判断有无线程在等待的方法如下,可见为从队列尾部往前遍历:

public final boolean hasQueuedPredecessors() {
    Node h, s;
    if ((h = head) != null) {
        if ((s = h.next) == null || s.waitStatus > 0) {
            s = null; // traverse in case of concurrent cancellation
            for (Node p = tail; p != h && p != null; p = p.prev) {
                if (p.waitStatus <= 0)
                    s = p;
            }
        }
        if (s != null && s.thread != Thread.currentThread())
            return true;
    }
    return false;
}

而对于队列中线程的唤醒机制,研究AQS的非公平锁与同步队列的FIFO冲突吗?AQS之线程的阻塞和唤醒分析 等文章 和 JDK的unparkSuccessor(Node node)方法(据我观察,入参node均为head),大致有以下结论:

当head的同步状态被释放后,需要唤醒后继节点。具体为从tail往head遍历,找到最前的一个阻塞节点。

条件队列

Lock的Condition会有这个。具体可查阅本博----朋熙面试(部分)二面中关于Monitor和AQS的部分


  1. 理解ReentrantLock的公平锁和非公平锁 ↩︎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_23204557

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值