模型服务连接失败

AQS的工作流程是怎样的?以ReentrantLock为例说明。

并发JavaJava 并发
分类
Java 并发
难度
未设置
来源数
1
更新时间
2026/03/28 21:25

答案

以ReentrantLock为例,当我们上锁的时候调用的是sync.lock()方法,该方法会根据当前是公平锁或非公平锁,进一步调用相应的lock方法,以非公平锁为例,在lock方法中,首先使用CAS操作尝试将state从0设置为1,如果成功则将当前线程设置为占有线程,失败的话就调用acquire方法。在acquire方法中,会调用tryAcquire再次去尝试获得锁,如果还是失败,则会调用addWaiter方法将该线程封装为node节点,并入队,然后调用acquireQueued方法,通过自旋的方式, 判断节点的状态,并进行相应处理,比如如果状态为0,则CAS修改为-1,如果状态为-1的话,则调用tryAcquire去抢锁。 释放锁时,调用的时unlock方法,对应sync的release方法,然后判断你是否为当前的占有线程,如果不是会抛出异常,是的话就将state-1,如果state==0,就释放锁,将占有线程置为null,并调用unparkSuccessor唤醒后续线程。

相关题目(5)

Java 并发并发JavaJava 并发
Java 并发并发JavaJava 并发
Java 并发并发JavaJava 并发
Java 并发并发JavaJava 并发
Java 并发并发JavaJava 并发

元信息

审核状态: active
关联来源: 1

来源面经题(0)

这道题目前没有手动沉淀的面经题来源。

来源(1)

Java八股(并发).md

knowledge_note
Question 105: AQS的工作流程是怎样的?以ReentrantLock为例说明。 Source answer: 以ReentrantLock为例,当我们上锁的时候调用的是sync.lock()方法,该方法会根据当前是公平锁或非公平锁,进一步调用相应的lock方法,以非公平锁为例,在lock方法中,首先使用CAS操作尝试将state从0设置为1,如果成功则将当前线程设置为占有线程,失败的话就调用acquire方法。在acquire方法中,会调用tryAcquire再次去尝试获得锁,如果还是失败,则会调用addWaiter方法将该线程封装为node节点,并入队,然后调用acquireQueued方法,通过自旋的方式, 判断节点的状态,并进行相应处理,比如如果状态为0,则CAS修改为-1,如果状态为-1的话,则调用tryAcquire去抢锁。 释放锁时,调用的时unlock方法,对应sync的release方法,然后判断你是否为当前的占有线程,如果不是会抛出异常,是的话就将state-1,如果state==0,就释放锁,将占有线程置为null,并调用unparkSuccessor唤醒后续线程。 Reviewed answer: 以ReentrantLock为例,加锁时先根据公平或非公平策略执行lock;非公平锁会先CAS尝试把state从0改为1,成功则设置当前线程为持有者,失败则进入acquire。acquire中先tryAcquire,失败则通过addWaiter入队,再在acquireQueued中自旋、判断前驱和状态并继续尝试获取锁。释放锁时调用release,校验当前线程为持有者后将state减1,若减到0则清空持有线程并唤醒后继节点。