并发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 并发
有哪些支持并发的集合?共源 1
Java 并发并发JavaJava 并发
元信息
审核状态: active
关联来源: 1
来源面经题(0)
这道题目前没有手动沉淀的面经题来源。
来源(1)
Java八股(并发).md
knowledge_noteQuestion 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则清空持有线程并唤醒后继节点。