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()