• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Android并发编程高级面试题汇总含详细 四

武飞扬头像
BlueSocks
帮助1

Android并发编程高级面试题汇总最全最细面试题讲解持续更新中👊👊 👀你想要的面试题这里都有👀 👇👇👇

ReentrantLock的实现原理

详细讲解

享学课堂移动互联网系统课程:架构师筑基必备技能《深入理解并发编程-AQS与JMM》

这道题想考察什么?

  1. 是否了解并发相关的理论知识
  2. 是否对于锁机制有个全面的理论认知
  3. 是否对于AQS原理有自己的理解

考察的知识点

  1. 锁的分类(公平锁、重入锁、重力度锁等等)
  2. 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部分

学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgbbekg
系列文章
更多 icon
同类精品
更多 icon
继续加载