前言
Java并发编程面试题在面试中具有重要的地位。通过充分准备和展示自己的并发编程技能,候选人可以增加获得理想职位的机会。继上一篇2024最全Android面试题及答案整理3【持续更新】之后,今天给大家分享2024最全Android面试题及答案整理4【持续更新】,有需要的朋友可以收藏了。
Java并发编程面试题汇总
4.1 假如只有一个cpu,单核,多线程还有用吗 ?
- 这道题想考察什么?
是否了解并发相关的理论知识 - 考察的知识点
1 . cpu多线程的基本概念
2 . 操作系统的调度任务机制
3 . CPU密集型和IO密集型理论 - 考生应该如何回答
CPU的执行速度要远大于IO的过程,因此在大多数情况下增加一些复杂的CPU计算都比增加一次IO要
快。单核CPU可以通过给每个线程分配CPU时间片(时间单元)来实现多线程机制。由于CPU频率很
高,故时间单元非常短。所以单核也可以实现多线程机制。
从用户体现上说,单核多线程也能够减少用户响应时间,例如web页面,也是防止IO阻塞。处理器的数
量和并不影响程序结构, 所以不管处理器的个数多少, 程序都可以通过使用多线程得到简化。
4.2 sychronied修饰普通方法和静态方法的区别?什么是可见性?(小米)
- 这道题想考察什么?
是否了解Java并发编程的相关知识 - 考察的知识点
4 . sychronied的原理
5 . 并发的特性 - 考生应该如何回答
sychronied是Java中并发编程的重要关键字之一。在并发编程中synchronized一直是解决线程安全问
题,它可以保证原子性,可见性,以及有序性。
原子性:原子是构成物质的基本单位,所以原子的意思代表着—“不可分”。由不可分可知,具有原
子性的操作也就是拒绝线程调度器中断
4.3 Synchronized在JDK1.6之后做了哪些优化 (京东) - 这道题想考察什么?
对并发编程的掌握 - 考察的知识点
并发与synchronized原理 - 考生如何回答
synchronized是Java中非常重要的一个关键字,对于Android开发同学来说,考虑到多线程的情况,一
般都直接使用到synchronized关键字对方法或者对象上锁。但是问题是为什么加上synchronized关键字
就能实现锁,它的原理是怎么回事呢?
字节码
如果我们使用javap -v xxx.class 反编译这样一个class文件
此时我们获得到结果为:
4.4 CAS无锁编程的原理(字节跳动)
- 这道题想考察什么?
并发相关问题,原子操作 - 考察的知识点
Java并发编程,乐观锁机制 - 考生如何回答
Jdk中java.util.concurrent.atomic包下的类都是采用CAS来实现的。
CAS原理分析
CAS(比较与交换,Compare and swap) 是一种有名的无锁算法。无锁编程,即不使用锁的情况下实
现多线程之间的变量同步,也就是在没有线程被阻塞的情况下实现变量的同步,所以也叫非阻塞同步
(Non-blocking Synchronization)。实现非阻塞同步的方案称为“无锁编程算法”( Non-blocking
algorithm)。
CAS机制当中使用了3个基本操作数:内存地址V,旧的预期值A,要修改的新值B。更新一个变量的时
候,只有当变量的预期值A和内存地址V当中的实际值相同时,才会将内存地址V对应的值修改为B。
4.5 AQS原理 (小米 京东)
- 这道题想考察什么?
是否了解Java并发编程的相关知识? - 考察的知识点
AQS的原理 - 考生应该如何回答
什么是AQS
AQS即AbstractQueuedSynchronizer,是一个用于构建锁和同步器的框架。它能降低构建锁和同步器
的工作量,还可以避免处理多个位置上发生的竞争问题。在基于AQS构建的同步器中,只可能在一个时
刻发生阻塞,从而降低上下文切换的开销,并提高吞吐量。
AQS核心思想是,如果被请求的共享资源空闲,那么就将当前请求资源的线程设置为有效的工作线程,
将共享资源设置为锁定状态;如果共享资源被占用,就需要一定的阻塞等待唤醒机制来保证锁分配。这
个机制主要用的是CLH队列的变体实现的,将暂时获取不到锁的线程加入到队列中。
4.6 ReentrantLock的实现原理
- 这道题想考察什么?
6 . 是否了解并发相关的理论知识
7 . 是否对于锁机制有个全面的理论认知
8 . 是否对于AQS原理有自己的理解 - 考察的知识点
9 . 锁的分类(公平锁、重入锁、重力度锁等等)
10 . ReentrantLock实现方式与Synchronized实现方式的异同点 - 考生应该如何回答
Java中的大部分同步类(Lock、Semaphore、ReentrantLock等)都是基于队列同步器—AQS实现的。
AQS原理见《4.5 AQS原理》。
4.7 Synchronized的原理以及与ReentrantLock的区别。(360)
- 这道题想考察什么?
11 . 是否了解并发相关的理论知识
12 . 是否对于锁机制有个全面的理论认知
13 . 是否对于AQS原理有自己的理解 - 考察的知识点
14 . 锁的分类(公平锁、重入锁、重力度锁等等)
15 . ReentrantLock实现方式与Synchronized实现方式的异同点 - 考生应该如何回答
Synchronized的原理见《4.8 Synchronized在JDK1.6之后做了哪些优化》。
ReentrantLock与Synchronized的区别,除了一个是Java类实现,一个是关键字之外,还包括
4.8 volatile关键字干了什么?(什么叫指令重排) (字节跳动)
- 这道题想考察什么?
是否了解volatile关键字与真实场景使用 - 考察的知识点
volatile关键字的概念在项目中使用与基本知识
考生应该如何回答
volatile是java提供的可以声明在成员属性前的一个关键字。在声明中包含此关键字的作用有:
保证内存可见性
可见性是指线程之间的可见性,一个线程修改的状态对另一个线程是可见的。也就是一个线程修改的结
果,另一个线程马上就能看到。
当对非volatile变量进行读写的时候,每个线程先从主内存拷贝变量到CPU缓存中,如果计算机有多个
CPU,每个线程可能在不同的CPU上被处理,这意味着每个线程可以拷贝到不同的CPU cache中。
volatile变量不会被缓存在寄存器或者对其他处理器不可见的地方,保证了每次读写变量都从主内存中
读,跳过CPU cache这一步。当一个线程修改了这个变量的值,新值对于其他线程是立即得知的
4.9 volatile 能否保证线程安全?在DCL上的作用是什么? - 这道题想考察什么?
1 . 是否了解Java并发编程的相关知识?
2 . 对象创建的过程 - 考察的知识点
1 . volatile的原理
2 . 编译优化 - 考生应该如何回答
volatile无法保证线程安全,只能保证变量的可见性,并不能保证变量操作的原子性。
原子性指的是一个或者多个操作在 CPU 执行的过程中不被中断的特性。
4.10 volatile和synchronize有什么区别?(B站 小米 京东)
- 这道题想考察什么?
是否了解Java并发编程的相关知识? - 考察的知识点
1 . volatile的原理
2 . synchronize的原理 - 考生应该如何回答
volatile 只能作用于变量,synchronized 可以作用于变量、方法、对象。
volatile 只保证了可见性和有序性,无法保证原子性,synchronized 可以保证线程间的有序性(个
人猜测是无法保证线程内的有序性,即线程内的代码可能被 CPU 指令重排序)、原子性和可见
性。
volatile 线程不阻塞,synchronized 线程阻塞。
volatile 本质是告诉 jvm 当前变量在寄存器中的值是不安全的需要从内存中读取;sychronized 则
是锁定当前变量,只有当前线程可以访问到该变量其他线程被阻塞。
volatile标记的变量不会被编译器优化, synchronized标记的变量可以被编译器优化。
写在最后
第一章 算法和数据结构面试题汇总
第二章 Java核心基础面试题汇总
第三章 Java深入泛型与注解面试题汇总
第四章 Java并发编程面试题汇总
第五章 Java虚拟机原理面试题汇总
第六章 Java反射类加载与动态代理面试题汇总
第七章 网络编程面试题汇总
第九章 高级UI面试题汇总
第十章 Framework内核解析面试题汇总
第十一章 Android组件内核面试题汇总
第十二章 程序性能优化与数据持久化面试题汇总
第十三章 开源框架面试题汇总