Android并发编程高级面试题汇总最全最细面试题讲解持续更新中👊👊 👀你想要的面试题这里都有👀 👇👇👇
ReentrantLock的实现原理
详细讲解
享学课堂移动互联网系统课程:架构师筑基必备技能《深入理解并发编程-AQS与JMM》
这道题想考察什么?
- 是否了解并发相关的理论知识
- 是否对于锁机制有个全面的理论认知
- 是否对于AQS原理有自己的理解
考察的知识点
- 锁的分类(公平锁、重入锁、重力度锁等等)
- ReentrantLock实现方式与Synchronized实现方式的异同点
考生应该如何回答
Java中的大部分同步类(Lock、Semaphore、ReentrantLock等)都是基于队列同步器—AQS实现的。AQS原理见 《4.5 AQS原理》 。
在ReentrantLock中有一个抽象类Sync:
private final Sync sync;
abstract static class Sync extends AbstractQueuedSynchronizer {
...
}
可以看到Sync就继承自AQS,而ReentrantLock的lock解锁、unlock释放锁等操作其实都是借助的sync来完成。
public void lock() {
sync.lock();
}
public void unlock() {
sync.release(1);
}
Sync是个抽象类,ReentrantLock根据传入构造方法的布尔型参数实例化出Sync的实现类FairSync和NonfairSync,分别表示公平锁和非公平锁。
public ReentrantLock() {
sync = new NonfairSync();
}
public ReentrantLock(boolean fair) {
sync = fair ? new FairSync() : new NonfairSync();
}
ReentrantLock与AQS的关系如下:
NonfairSync
在ReentrantLock的默认无参构造方法中,sync会被是实例化为:NonfairSync 表示非公平锁。
lock
static final class NonfairSync extends Sync {
final void lock() {
if (compareAndSetState(0, 1))
setExclusiveOwnerThread(Thread.currentThread());
else
acquire(1);
}
}
NonfairSync就是一个AQS。因此在执行lock时,会首先利用CAS( 《4.4 CAS无锁编程原理》 )尝试设置AQS的state为1。如果设置成功表示成功获取锁;否则表示其他线程已经占用,此时会使用AQS#acquire将尝试获取锁失败的线程放入AQS的等待队列进行等待并且将线程挂起。
unlock
lock获取锁需要对state进行加1,那么对于重入锁而言,重入一次就需要对state执行一次加1。这样子,在解锁的时候,每次unlock就对state减一,等到state的值为0的时候,才能唤醒下一个等待线程。
因此ReentrantLock#unlock,实际上就是执行了AQS的release(1):
public void unlock() {
sync.release(1);
}
FairSync
对于NonfairSync 而言,线程只要执行lock请求,就会马上尝试获取锁,不会管AQS当前管理的等待队列中是否存在正在等待的线程,这对于等待的线程不公平,因此NonfairSync表示非公平锁。
而FairSync表示公平锁,会在lock请求进行时,先判断AQS管理的等待队列中是否已经有正在等待的线程,有的话就不会尝试获取锁,直接进入等待队列,保证了公平性。此时FairSync#lock实际上执行的就是AQS的acquire
static final class FairSync extends Sync {
final void lock() {
acquire(1);
}
}
由于面试题内容比较多,篇幅有限,已经被整理成了PDF指南,有需要2023年Android中高级最全面试真题答案 完整文档的
详细Vx关注公众号:Android老皮
目录
第一章 Java方面
●Java基础部分
●Java集合
●Java多线程
●Java虚拟机
第二章 Android方面
●Android四大组件相关
●Android异步任务和消息机制
●Android UI绘制相关
●Android性能调优相关
●Android中的IPC
●Android系统SDK相关
●第三方框架分析
●综合技术
●数据结构方面
●设计模式
●计算机网络方面
●Kotlin方面
第三章 音视频开发高频面试题
●为什么巨大的原始视频可以编码成很小的视频呢?这其中的技术是什么呢?
●怎么做到直播秒开优化?
●直方图在图像处理里面最重要的作用是什么?
●数字图像滤波有哪些方法?
●图像可以提取的特征有哪些?
●衡量图像重建好坏的标准有哪些?怎样计算?
第四章 Flutter高频面试题
●Dart部分
●Flutter部分