前言

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!");
}
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

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标记的变量可以被编译器优化。

写在最后

第一章 算法和数据结构面试题汇总

2024最全Android面试题及答案整理4【持续更新】_多线程

第二章 Java核心基础面试题汇总

2024最全Android面试题及答案整理4【持续更新】_android_02

第三章 Java深入泛型与注解面试题汇总

2024最全Android面试题及答案整理4【持续更新】_面试_03

第四章 Java并发编程面试题汇总

2024最全Android面试题及答案整理4【持续更新】_android_04

第五章 Java虚拟机原理面试题汇总

2024最全Android面试题及答案整理4【持续更新】_面试_05

第六章 Java反射类加载与动态代理面试题汇总

2024最全Android面试题及答案整理4【持续更新】_Java_06

第七章 网络编程面试题汇总

2024最全Android面试题及答案整理4【持续更新】_Java_07

第九章 高级UI面试题汇总

2024最全Android面试题及答案整理4【持续更新】_Java_08

第十章 Framework内核解析面试题汇总

2024最全Android面试题及答案整理4【持续更新】_并发编程_09

第十一章 Android组件内核面试题汇总

2024最全Android面试题及答案整理4【持续更新】_android_10

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

2024最全Android面试题及答案整理4【持续更新】_并发编程_11

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

2024最全Android面试题及答案整理4【持续更新】_android_12