面试官: 有了解过ReentrantLock的底层实现吗?说说看
前言
目前正在出一个Java多线程专题长期系列教程,从入门到进阶含源码解读, 篇幅会较多, 喜欢的话,给个关注❤️ ~
源码剖析
上节带大家学习了它的基本使用,我们可以了解到它是一个可重入锁,下面我们就一起看一下它的底层实现~
构造函数
我们在使用的时候,都是先new它,所以我们先看下它的构造函数,它主要有两个:
static final class FairSync extends Sync {
private static final long serialVersionUID = -3000897897090466540L;
// 这个方法最终调用 tryAcquire
final void lock() {
acquire(1);
}
// 公平锁的实现
protected final boolean tryAcquire(int acquires) {
final Thread current = Thread.currentThread();
int c = getState();
// 这边和非公平锁的实现有些相似 同样判断状态
if (c == 0) {
// 判断排队队列是否存在, 不存在并且比较期望值
if (!hasQueuedPredecessors() &&
compareAndSetState(0, acquires)) {
// 设置独占线程 并返回成功
setExclusiveOwnerThread(current);
return true;
}
}
// 这边和上面类似
else if (current == getExclusiveOwnerThread()) {
int nextc = c + acquires;
if (nextc < 0)
throw new Error("Maximum lock count exceeded");
setState(nextc);
return true;
}
return false;
}
}
它的实现比较简单,通过实现可以发现,它按照申请锁的顺序来获取锁,排第一的先拿到锁,再结合上面的概念理解一下,就很好理解了.
释放锁unlock,上面我们已经讲过了~

结束语
本节内容可能有点多,主要是看源码,可以打断点自己调一下, 举一反三,通过源码去理解一下什么是公平锁和非公平锁, ReentrantLock可重入锁体验在哪里。下一节,带大家理解一下CAS与原子操作的概念 ~
往期内容推荐
-
-
-
-
-
-
-
-
-
-
-
-
-
我的博客(阅读体验较佳)
-
-
-
-
-
项目源码(源码已更新 欢迎star⭐️)
-
java-thread-all
-
地址: https://github.com/qiuChengleiy/java-thread-all.git
推荐 SpringBoot & SpringCloud (源码已更新 欢迎star⭐️)
-
springboot-all
-
地址: https://github.com/qiuChengleiy/springboot-all.git -
-
本篇文章来源于微信公众号: 程序员皮卡秋
微信扫描下方的二维码阅读本文

Comments NOTHING