前言

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文件
    此时我们获得到结果为:

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

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组件内核面试题汇总

在这里插入图片描述

第十二章 程序性能优化与数据持久化面试题汇总

在这里插入图片描述

第十三章 开源框架面试题汇总

在这里插入图片描述

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐