ReentrantLock非公平锁原理详解
创作时间:
作者:
@小白创作中心
ReentrantLock非公平锁原理详解
引用
CSDN
1.
https://blog.csdn.net/m0_62645012/article/details/138963528
ReentrantLock是非阻塞锁的一种实现,它提供了比synchronized更灵活的锁获取方式。本文将深入探讨ReentrantLock的非公平锁实现原理,包括加锁和解锁的具体过程。
ReentrantLock有两种锁:公平锁和非公平锁。从构造器来看,ReentrantLock默认实现是非公平锁。
1. 非公平锁原理
加锁过程
当没有竞争时,非公平锁会直接将exclusiveOwnerThread设置为当前线程,并将state设置为1。
当有多个线程竞争锁时,线程会通过acquire方法尝试获取锁:
public final void acquire(int arg) {
if (!tryAcquire(arg) &&
acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
selfInterrupt();
}
如果CAS操作失败,线程会进入等待队列:
private Node addWaiter(Node mode) {
Node node = new Node(Thread.currentThread(), mode);
Node pred = tail;
if (pred != null) {
node.prev = pred;
if (compareAndSetTail(pred, node)) {
pred.next = node;
return node;
}
}
enq(node);
return node;
}
线程进入acquireQueued方法后,会不断尝试获取锁:
final boolean acquireQueued(final Node node, int arg) {
boolean failed = true;
try {
boolean interrupted = false;
for (;;) {
final Node p = node.predecessor();
if (p == head && tryAcquire(arg)) {
setHead(node);
p.next = null;
failed = false;
return interrupted;
}
if (shouldParkAfterFailedAcquire(p, node) &&
parkAndCheckInterrupt())
interrupted = true;
}
} finally {
if (failed)
cancelAcquire(node);
}
}
如果线程在队列中,会通过shouldParkAfterFailedAcquire方法检查是否需要阻塞:
private static boolean shouldParkAfterFailedAcquire(Node pred, Node node) {
int ws = pred.waitStatus;
if (ws == Node.SIGNAL)
return true;
if (ws > 0) {
do {
node.prev = pred = pred.prev;
} while (pred.waitStatus > 0);
pred.next = node;
} else {
compareAndSetWaitStatus(pred, ws, Node.SIGNAL);
}
return false;
}
如果需要阻塞,线程会通过parkAndCheckInterrupt方法进入等待状态:
private final boolean parkAndCheckInterrupt() {
LockSupport.park(this);
return Thread.interrupted();
}
解锁过程
当持有锁的线程释放锁时,会调用release方法:
public final boolean release(int arg) {
if (tryRelease(arg)) {
Node h = head;
if (h != null && h.waitStatus != 0)
unparkSuccessor(h);
return true;
}
return false;
}
如果释放成功,会唤醒等待队列中的下一个线程:
private void unparkSuccessor(Node node) {
int ws = node.waitStatus;
if (ws < 0)
compareAndSetWaitStatus(node, ws, 0);
Node s = node.next;
if (s == null || s.waitStatus > 0) {
s = null;
for (Node t = tail; t != null && t != node; t = t.prev)
if (t.waitStatus <= 0)
s = t;
}
if (s != null)
LockSupport.unpark(s.thread);
}
注意事项
- 是否需要唤醒线程是由当前节点的前驱节点的
waitStatus决定的,而不是本节点的waitStatus。 - 非公平锁允许新来的线程插队,这可能会导致某些线程长时间等待。
热门推荐
悄然侵蚀幸福:揭秘毁灭婚姻的9大隐形杀手
异地恋攻略:让感情在距离中升温
异地恋神器:用科技让爱跨越千山万水
玉树十年重生:生态环境与特色产业双轮驱动
玉树震后藏族文化的守护之路
乐施会与玉树地震:一场关于人文关怀的救援行动
华西医疗队在玉树地震中的救援奇迹
青海玉树震后卫生保障:专家支招
《把人物写活》:从理论到实践的人物塑造指南
网文创作:如何用老套情节塑造鲜活角色?
平板硫化机操作指南:从入门到精通
私立高中休学潮:家长如何正确引导?
故意行为背后的心理动机分析
西宁导游推荐景点:青海湖
青海湖旅游攻略:探寻美食与美景之旅
唐山大地震48周年:幸存者如何走出心理阴影?
曹红芬回忆:唐山地震后的生死救援
唐山大地震:那些感人至深的故事
唐山抗震楼:40年重生之路的见证者
一字之差,氯雷他定与地氯雷他定的区别有多大?医生给您正确答案
水淹古墓:传统风水智慧与现代科学的对话
祖坟被水淹?教你正确应对风水危机!
祖坟被水淹,祭奠权如何保障?
江苏师大心健考研经验分享:高分上岸秘籍!
私立高中心理健康:复学那些事儿
私立高中复学政策全解读:条件、流程、费用一次性说明白
皇位之争:康熙帝儿子们的皇权角逐
如何选择适合自己的温泉场所?这样的选择需要考虑哪些方面?
创新教学法:开启语文教学新篇章
高考改革背景下:高中语文教师如何提升学生文学素养?