写点什么

面试答不上 Java 并发编程?阿里 P8 提供的 27 道并发面试解析,请查收

作者:Java浪潮
  • 2022 年 5 月 12 日
  • 本文字数:1513 字

    阅读完需:约 5 分钟

并发编程相比 Java 中其他知识点学习起来门槛相对较高,学习起来比较费劲,从而导致很多人望而却步;而无论是职场面试和高并发高流量的系统的实现却都还离不开并发编程,从而导致能够真正掌握并发编程的人才成为市场比较迫切需求的。

因此,大家不难发现 Java 并发问题一直是各个大厂面试的重点之一。我在平时的面试中,也发现很多候选人对一些基本的并发概念表示没听过,或原理不理解,可能知道一些却又讲不清楚,最终导致面试失败。本文会结合实际中接触到的一些面试题,重点来聊一聊 Java 并发中的相关知识点。


并发编程高级面试专题

Synchronized 相关面试题集


可重入锁 ReentrantLock 及其他显式锁相关面试题集


Java 线程池相关问题


Java 内存模型相关问题


面试题答案

1.Synchronized 用过吗, 其原理是什么?

这是一道 Java 面试中几乎百分百会问到的问题, 因为没有任何写过并发程序的开发者会没听说或者没接触过 Synchronized。 Synchronized 是由 JVM 实现的一种实现互斥同步的一种方式, 如果你查看被 Synchronized 修饰过的程序块编译后的字节码, 会发现, 被 Synchronized 修饰过 的程序块, 在编译前后被编译器生成了 monitorenter 和 monitorexit 两个字节码指 令。这两个指令是什么意思呢? 在虚拟机执行到 monitorenter 指令时, 首先要尝试获取对象的锁: 如果这个对象没 有锁定, 或者当前线程已经拥有了这个对象的锁, 把锁 的 计 数 器 +1; 当 执 行 monitorexit 指令时将锁计 数 器 -1; 当计数器为 0 时 , 锁就被 释放了 。 如果获取对象失败了, 那当前线程就要阻塞等待, 直到对象锁被另外一个线程释放为 止。Java 中 Synchronize 通过在对象头设置标记 , 达到了获取锁和释放锁的目的 。

2.跟 Synchronized 相比, 可重入锁 Reentrant Lock 其实现原理有什么不同?

其实, 锁的实现原理基本是为了达到一个目的: 让所有的线程都能看到某种标记。 Synchronized 通过在对象头中设置标记实现了这一目的 , 是一种 JVM 原 生的锁实现方式, 而 Reentrant Lock 以及所有的基于 Lock 接口的实现类, 都是通过用一个 volitile 修饰的 int 型变量,并保证每个线程都能拥有对该 int 的可见性和原子修改, 其本质是基于所谓的 AQS 框架。

3. Java 中的线程池是如何实现的?

1.在 Java 中 , 所谓的线程池中的 “ 线 程 ” ,其 实 是 被 抽 象 为了一个静态内部类 Worker, 它 基 于 AQS 实 现 , 存 放 在 线 程 池 的 Hash Set< Worker> workers 成 员 变 量 中 ; 2.而需要执行的任务则存放在成员变量 work Queue ( Blocking Queue< Runnable> work Queue) 中。 这样 , 整个线程池实现的基本思想就是:从 work Queue 中不断取出需 要 执 行 的 任 务 , 放在 Workers 中进行处理 。

4.什么是 Java 的内存模型, Java 中各个线程是怎么彼此看到对方的变量的?

Java 的内存模型定义了程序中各个变量的访问规则, 即在虚拟机中将变量存储到内 存和从内存中取出这样的底层细节。 此处的变量包括实例字段、 静态字段和构成数组对象的元素, 但是不包括局部变量和 方法参数, 因为这些是线程私有的, 不会被共享, 所以不存在竞争问题。 Java 中各个线程是怎么彼此看到对方的变量的呢?Java 中定义了主内存与工作内存 的概念: 所有的变量都存储在主内存, 每条线程还有自己的工作内存, 保存了被该线程使用到 的变量的主内存副本拷贝。 线程对变量的所有操作( 读取、 赋值) 都必须在工作内存中进行, 不能直接读写主 内存的变量。 不同的线程之间也无法直接访问对方工作内存的变量, 线程间变量值的 传递需要通过主内存。

由于篇幅限制,太长看下去会很乏味,也会影响阅读体验,上面是每个题集的一题答案,下面展现将以图片形式展示。获取原文件以及更多资源请看小编个签




用户头像

Java浪潮

关注

更多技术交流,关注公众号:JavaAC 2022.05.07 加入

还未添加个人简介

评论

发布
暂无评论
面试答不上Java并发编程?阿里P8提供的27道并发面试解析,请查收_Java_Java浪潮_InfoQ写作社区