AQS ReentrantLock 加锁 释放锁的流程图
2025-09-17 13:49:19 0 举报
- ReentrantLock加锁流程 - 线程到达锁资源,检查状态。 - 锁处于空闲状态,尝试获取锁。 - 成功,线程成为锁的拥有者。 - 若锁已被其他线程占用,则线程进入等待队列。 - 队列中的线程将按顺序尝试获取锁。 - ReentrantLock释放锁流程 - 拥有锁的线程发出解锁指令。 - 线程释放锁,并检查等待队列中的线程。 - 选择下一个线程或节点唤醒。 - 唤醒的线程尝试再次获取锁。 - 解锁后,之前的线程返回到可运行状态。
作者其他创作
大纲/内容
tryRelease(1)尝试释放方法
enq(node) 循环排队
public final boolean hasQueuedPredecessors() { // The correctness of this depends on head being initialized // before tail and on head.next being accurate if the current // thread is first in queue. Node t = tail; // Read fields in reverse initialization order Node h = head; Node s; return h != t &&//首尾不相等,有队列。 //有队列下一个节点为null说明是正在加队列。 ((s = h.next) == null || s.thread != Thread.currentThread());//是否持锁线程 }
(当前持有锁的线程节点)exclusive Owner Thread=nullwaitStatus=0(下一个节点是否挂起)next=node1//下个节点prev=null
node3
node1(第一个枪锁节点)exclusive Owner Thread=thread1waitStatus=-1next=node2 下个节点prev=head 上个节点
非公平锁FairSync
非公平锁的tryAcquire(1)方法
默认是
2
2步
1
1步
unlock() 解锁
lock() 上锁
控制状态private volatile int state
private final boolean parkAndCheckInterrupt() { LockSupport.park(this);//挂起线程 return Thread.interrupted(); }
public void unlock() { sync.release(1);//释放一层锁 }
1.释放锁:释放状态,释放锁线程2.判断头节点,换头操作,有等待的节点挂起,唤醒下个节点
protected final boolean tryAcquire(int acquires) { final Thread current = Thread.currentThread();//获取当前线程 int c = getState(); //AQS 锁的状态 if (c == 0) { //无锁 if (font color=\"#e74f4c\
公平锁的tryAcquire(1)方法
protected final boolean tryRelease(int releases) {//参数是1 int c = getState() - releases;//获取新的状态 if (Thread.currentThread() != getExclusiveOwnerThread()) //是否本线程 throw new IllegalMonitorStateException(); boolean free = false; if (c == 0) { //如果达到无锁状态 free = true; setExclusiveOwnerThread(null); //设置锁的独占线程为null } setState(c); 更新锁状态 return free; }
tail
parkAndCheckInterrupt()线程挂起
ReentrantLock
node2
AQS
head
acquire(1)方法
final void lock() { acquire(1);//锁的核心逻辑方法 }
span style=\"font-size:inherit;\
(第一个节点改为头节点)exclusive Owner Thread=nullwaitStatus=0(下一个节点是否挂起)next=node0//下个节点prev=null
public final boolean release(int arg) {//参数是1 if (tryRelease(arg)) {// 释放状态成功,锁持有线程为null; Node h = head; if (h != null && h.waitStatus != 0)// 如果有节点,头节点的下一个节点是否挂起? unparkSuccessor(h); //唤醒下个节点枪锁 return true; } return false; }
公平锁NonfairSync
双向链表队列node(等待队列)
release(1)释放
单向链表condition(等待队列)
shouldParkAfterFailedAcquire()
0 条评论
下一页