ReentrantLock源码解析
2020-08-24 16:29:44 0 举报
java ReentrantLock源码分析
作者其他创作
大纲/内容
Sync(内部类)
非公平锁
继承
waitStatus状态描述SIGNAL = -1 //可被唤醒CANCELLED = 1 //取消,代表出现异常/中断引起的,需要移除CONDITION = -2 // 条件等待PROPAGATE = -3 // 传播0 - 初始状态Init状态
Lock
// 尝试获取锁protected final boolean tryAcquire(int acquires) { return nonfairTryAcquire(acquires); }
// 中断,此处为了唤醒已在队列中的线程static void selfInterrupt() { Thread.currentThread().interrupt(); }
sync.release(1)
实现
lock.unlock()
nonfairSync.lock()
NonfairSync
公平锁
FairSync
ReentrantLock
private final boolean parkAndCheckInterrupt() { // 阻塞线程,程序可在外部通过interrupt唤醒 LockSupport.park(this); // 返回中断状态,并清除中断状态 return Thread.interrupted(); }
非公平式
AbstractQueuedSynchronizer(AQS)
fairSync.lock();
// 释放锁protected final boolean tryRelease(int releases) { int c = getState() - releases; // 如果当前线程不是当前持锁线程,抛异常 if (Thread.currentThread() != getExclusiveOwnerThread()) throw new IllegalMonitorStateException(); boolean free = false; // 如果持锁state-1==0 则表明当前线程持有最后一把锁,进行释放 if (c == 0) { free = true; setExclusiveOwnerThread(null); } // 将锁状态恢复0 setState(c); return free; }
lock.lock()
包含
// 释放锁public final boolean release(int arg) { if (tryRelease(arg)) { Node h = head; if (h != null && h.waitStatus != 0) unparkSuccessor(h); return true; } return false; }
公平式
// 公平方式,尝试获取锁,如果成功返回true,失败返回false protected final boolean tryAcquire(int acquires) { final Thread current = Thread.currentThread(); int c = getState(); if (c == 0) { if ( // 判断等待队列中是否有线程 !font color=\"#ff3333\
区别:公平锁:先判断队列中是否有阻塞线程非公平锁:直接尝试获取锁
// 将节点置为取消private void cancelAcquire(Node node) { if (node == null) return; node.thread = null; Node pred = node.prev; // 如果上个节点的状态>0 代表上个节点也是取消节点,则当前节点pre指向上上个节点(跳过上个节点),直 // 到找到<=0 的节点 // font color=\"#ff3333\
aqs.acquire(1);
// 查看队列是否有其他等待线程public final boolean hasQueuedPredecessors() { Node t = tail; Node h = head; Node s; // 头引用与尾引用未指向同一个节点 // && (头引用的下个节点空 || 下个节点非当前节点) return h != t && ((s = h.next) == null || s.thread != Thread.currentThread()); }
收藏
收藏
0 条评论
下一页