Android并发编程高级面试题汇总(含详细解析 一)

本文详细解读了Android面试中关于并发编程的高级题目,涉及单核多线程的意义、synchronized在Java中的应用(包括synchronized修饰方法的区别)、以及JDK1.6后synchronized的优化,如偏向锁、轻量级锁和重量级锁。提供面试技巧和深入原理分析。
摘要由CSDN通过智能技术生成

Android并发编程高级面试题汇总最全最细面试题讲解持续更新中👊👊

👀你想要的面试题这里都有👀

👇👇👇

假如只有一个cpu,单核,多线程还有用吗 ?

这道题想考察什么?

是否了解并发相关的理论知识

考察的知识点

  1. cpu多线程的基本概念
  2. 操作系统的调度任务机制
  3. CPU密集型和IO密集型理论

考生应该如何回答

CPU的执行速度要远大于IO的过程,因此在大多数情况下增加一些复杂的CPU计算都比增加一次IO要快。单核CPU可以通过给每个线程分配CPU时间片(时间单元)来实现多线程机制。由于CPU频率很高,故时间单元非常短。所以单核也可以实现多线程机制。

从用户体现上说,单核多线程也能够减少用户响应时间,例如web页面,也是防止IO阻塞。处理器的数量和并不影响程序结构, 所以不管处理器的个数多少, 程序都可以通过使用多线程得到简化。


sychronied修饰普通方法和静态方法的区别?什么是可见性?(小米)

详细讲解

享学课堂移动互联网系统课程:架构师筑基必备技能《线程与进程的理论知识入门1》

这道题想考察什么?

是否了解Java并发编程的相关知识

考察的知识点

  1. sychronied的原理
  2. 并发的特性

考生应该如何回答

sychronied是Java中并发编程的重要关键字之一。在并发编程中synchronized一直是解决线程安全问题,它可以保证原子性,可见性,以及有序性。

  • 原子性:原子是构成物质的基本单位,所以原子的意思代表着—“不可分”。由不可分可知,具有原子性的操作也就是拒绝线程调度器中断。
  • 可见性:一个线程对共享变量的修改,另一个线程能够立刻看到,称为可见性。
  • 有序性:程序按照代码的先后顺序执行。编译器为了优化性能,有时会改变程序中语句的顺序,但是不会影响最终的结果。有序性经典的例子就是利用DCL双重检查创建单例对象。

synchronized可以修饰方法,也能够使用synchronized(obj){}定义同步代码块。

  • 修饰方法:

    1. 实例方法,作用于当前实例加锁,进入方法前需要获取当前实例的锁;
    2. 静态方法,作用于当前类对象加锁,进入方法前需要获取当前类对象的锁;
  • 修饰代码块,指定加锁对象,对给定对象加锁,进入代码块前要获得给定对象的锁。

使用sychronied修饰普通方法和静态方法,其实也等价于synchronized(this){}synchronized(class){}


4.3 Synchronized在JDK1.6之后做了哪些优化 (京东)

详细讲解

享学课堂移动互联网系统课程:架构师筑基必备技能《线程与进程的理论知识入门1》

这道题想考察什么?

对并发编程的掌握

考察的知识点

并发与synchronized原理

考生如何回答

synchronized是Java中非常重要的一个关键字,对于Android开发同学来说,考虑到多线程的情况,一般都直接使用到synchronized关键字对方法或者对象上锁。但是问题是为什么加上synchronized关键字就能实现锁,它的原理是怎么回事呢?

字节码

如果我们使用javap -v xxx.class 反编译这样一个class文件

public static void main(String[] args) {
        synchronized (InjectTest.class) {
            System.out.println("hello!");
        }
}

此时我们获得到结果为:

在这里插入图片描述

可以看到javap的输出信息中存在:monitorenter与monitorexit指令。这就代表了同步代码块的入口与出口。

这里的monitor是:对象监视器。在JVM中,每个对象都会和一个对象监视器(monitor)相关联。monitorenter指令插入到同步代码块开始的位置、monitorexit指令插入到同步代码块结束位置,jvm需要保证每个monitorenter都有一个monitorexit对应。这两个指令,本质上都是对 对象监视器(monitor)进行获取,这个过程是排他的,也就是说同一时刻只能有一个线程获取到由synchronized所保护对象的监视器。线程执行到monitorenter指令时,会尝试获取对象所对应的monitor所有权,也就是尝试获取对象的锁;而执行monitorexit,就是释放monitor的所有权。 如果其他线程已经占用了monitor,则当前线程进入阻塞状态。

当然这是jdk1.6之前的行为,而jdk1.6以后为了减少获得锁和释放锁带来的性能消耗,对synchronized锁进行了优化,包含偏向锁、轻量级锁、重量级锁;

关于锁类型与相关信息的信息都是存放在锁对象的对象头中 ,在了解偏向锁、轻量级锁、重量级锁之前,我们必须先认识一下什么是对象头!

Java对象头

对象在虚拟机内存中的布局分为三块区域:对象头、实例数据和对齐填充;Java对象头是实现synchronized的锁对象的基础,一般而言,synchronized使用的锁对象是存储在Java对象头里。

对象头由:存储对象自身的运行时数据的Mark Word 32位系统中4 + 指向类的指针 kClass pointer ,如果是数组对象还会有数组长度 Array Length。

其中mark word中就存储了锁状态:

img

在无锁状态下,mark word中的数据为:
在这里插入图片描述

包含对象hashcode,gc年龄,是否偏向锁与锁标志信息。

偏向锁

而偏向锁下,数据则为:

在这里插入图片描述

拥有锁的线程ID, epoch 大家可以先理解为校验位,同时 是否偏向锁标记由相对无锁状态下的0变为1。

首先之所以会引入偏向锁是因为:大多数情况下锁不仅不存在多线程竞争,而且总是由同一线程多次获得,为了让线程获得锁的代价更低而引入了偏向锁,减少不必要的操作。

在程序进入同步代码块时,会访问Mark Word中偏向锁的标识是否设置成1,锁标志位是否为01,若为偏向锁状态,则查看偏向锁状态下线程ID是否指向当前线程。如果是则直接执行同步代码。但是mark word中记录的线程ID如果不是当前线程,则通过CAS比较与交换尝试修改对象头获得锁。CAS操作成功则可以直接执行同步代码,否则表示有其他线程竞争,此时获得偏向锁的线程被挂起,偏向锁升级为轻量级锁 ,然后被阻塞的线程继续往下执行同步代码。

轻量级锁

在这里插入图片描述

轻量级锁状态下,代码进入同步块时,如果同步对象锁状态为无锁状态, 虚拟机首先将在当前线程的栈帧中建立一个名为锁记录(Lock Record)的空间,用于存储锁对象目前的Mark Word的拷贝 ,接着虚拟机将使用CAS操作尝试将对象的Mark Word更新为指向Lock Record的指针 。这个操作如果成功则代表获取到了锁,但是如果失败,则会检查对象Mark Word是不是指向当前线程栈帧中的锁记录,如果是,则说明本身当前线程就拥有此对象的锁,就可以直接执行同步代码。否则说明锁对象被其他线程获取,当前线程是竞争者,那么当前线程会自旋等待锁,也就是不断重试,当重试一定次数后,总不能一直重试下去吧,太耗CPU了。所以这时候就要升级为重量级锁。

重量级锁

重量级锁就是通过对象监视器(monitor)实现,其中monitor的本质是依赖于底层操作系统的Mutex Lock实现,操作系统实现线程之间的切换需要从用户态到内核态的切换,切换成本非常高。主要是,当系统检查到锁是重量级锁之后,会把等待想要获得锁的线程进行阻塞,被阻塞的线程不会消耗cup。但是阻塞或者唤醒一个线程时,都需要操作系统来帮忙,这就需要从用户态转换到内核态,而转换状态是需要消耗很多时间的,有可能比用户执行代码的时间还要长。

由于面试题内容比较多,篇幅有限,资料已经被整理成了PDF文档,有需要2023年Android中高级最全面试真题答案 完整文档的可扫描下方卡片免费获取~

PS:(文末还有使用ChatGPT机器人小福利哦!!大家不要错过)

目录

在这里插入图片描述

第一章 Java方面

●Java基础部分
●Java集合
●Java多线程
●Java虚拟机

在这里插入图片描述

第二章 Android方面

●Android四大组件相关
●Android异步任务和消息机制
●Android UI绘制相关
●Android性能调优相关
●Android中的IPC
●Android系统SDK相关
●第三方框架分析
●综合技术
●数据结构方面
●设计模式
●计算机网络方面
●Kotlin方面

在这里插入图片描述

第三章 音视频开发高频面试题

●为什么巨大的原始视频可以编码成很小的视频呢?这其中的技术是什么呢?
●怎么做到直播秒开优化?
●直方图在图像处理里面最重要的作用是什么?
●数字图像滤波有哪些方法?
●图像可以提取的特征有哪些?
●衡量图像重建好坏的标准有哪些?怎样计算?

在这里插入图片描述

第四章 Flutter高频面试题

●Dart部分
●Flutter部分

在这里插入图片描述

第五章 算法高频面试题

●如何高效寻找素数
●如何运用二分查找算法
●如何高效解决雨水问题
●如何去除有序数组的重复元素
●如何高效进行模幂运算
●如何寻找最长回文子串

在这里插入图片描述

第六章 Andrio Framework方面

●系统启动流程面试题解析
●Binder面试题解析
●Handler面试题解析
●AMS面试题解析

在这里插入图片描述

第七章 企业常见174道面试题

●SD卡
●Android的数据存储方式
●Broadcast Receiver
●sp频繁操作会有什么后果?sp能存多少数据?
●dvm与jvm的区别
●ART
●Activity的生命周期
●Application能不能启动Activity
●…

在这里插入图片描述

搭建了一个基于chatGPT的微信群聊机器人,24小时为大家解答疑难技术问题, 需要的可以扫描二维码进群。

图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值