当前位置:首页 > Java技术 > Java面试:投行的15个多线程和并发面试题

Java面试:投行的15个多线程和并发面试题

2022年09月16日 15:11:23Java技术4

多线程和并发问题已成为各种 Java 面试中必不可少的一部分。如果你准备参加投行的 Java 开发岗位面试,比如巴克莱银行(Barclays)、花旗银行(Citibank)、摩根史坦利投资公司(Morgan Stanley),你会遇到很多有关多线程的面试题。多线程和并发是投行面试的热门知识点,尤其是在面试有关电子交易开发工作时,他们喜欢用棘手的 Java 线程面试题轰炸面试者。他们希望确保面试者对 Java 多线程和并发有扎实的知识基础,因为他们大多数关注高性能带来的竞争优势。

举个例子,直接市场准入模式(Direct to Market,DMA)使用高容量低延迟的电子交易系统,通常来说是并发的。大多数时间他们致力于微秒级的延迟,所以掌握如何有效地降低延迟、提高吞吐量非常重要。

有一些 Java 线程面试题是我特别中意的。我并不会直接给你答案,而是尽可能给你指点。我会之后补充上详细答案,正如我在其他文章中那样。

JDK 1.5 中引入并发包之后,并发工具和并发集合备受欢迎,比如 ThreadLocal、 BlockingQueue、Counting Semaphore 和 ConcurrentHashMap,与这些工具相关的面试题也越来越多。

Java 8 和 Java 9 也是这种情况。围绕 lambda 表达式、并行流(parallel streams)、新的 Fork/Join 线程池、CompletableFuture 的问题在 2018 年不断涌现,2019 年还将持续。今后你也应该对这些知识点有所准备。

15 个 Java 线程面试题和答案

总之不要考虑那么多,下面是各种投行,比如巴克莱银行(Barclays)、花旗银行(Citibank)、摩根史坦利投资公司(Morgan Stanley)等等,面试 Java 开发者时常问的 Java 多线程和并发问题。

1. 现在有线程 T1、T2 和 T3。你如何确保 T2 线程在 T1 之后执行,并且 T3 线程在 T2 之后执行?

这个线程面试题通常在第一轮面试或电话面试时被问到,这道多线程问题为了测试面试者是否熟悉 join 方法的概念。答案也非常简单——可以用 Thread 类的 join 方法实现这一效果。

2. Java 中新的 Lock 接口相对于同步代码块(synchronized block)有什么优势?如果让你实现一个高性能缓存,支持并发读取和单一写入,你如何保证数据完整性。

多线程和并发编程中使用 lock 接口的最大优势是它为读和写提供两个单独的锁,可以让你构建高性能数据结构,比如 ConcurrentHashMap 和条件阻塞。
这道 Java 线程面试题越来越多见,而且随后的面试题都基于面试者对这道题的回答。
我强烈建议在任何 Java 多线程面试前都要多看看有关锁的知识,因为如今电子交易系统的客户端和数据交互中,锁被频繁使用来构建缓存。

3. Java 中 wait 和 sleep 方法有什么区别?

我们来看看另一个经常被问到的线程面试题。这道题常出现在电话面试中。两者主要的区别就是等待释放锁和监视器。sleep方法在等待时不会释放任何锁或监视器。wait 方法多用于线程间通信,而 sleep 只是在执行时暂停。可以看我另一篇有关Java 中 wait 和 sleep的文章。

4. 如何在 Java 中实现一个阻塞队列?

这是一道相对困难的 Java 多线程面试题,考察点很多。它考察了面试者是否真正写过 Java 多线程代码,考察了面试者对并发场景的理解。并且可以根据面试者的代码问很多后续问题,如果他用 wait() 和 notify() 方法成功实现了阻塞队列,可以让他用 Java 5 的并发类重新实现一次。

5. 如何在 Java 中编写代码解决生产者消费者问题?答案

和上面有关线程的问题相似,这个问题在工作中很典型,但有时面试官会问这类问题,比如“在 Java 中如何解决生产者消费者问题?”其实,有很多解决方式。我分享过用 Java 中 BlockingQueue 的解决方案。有时他们甚至会让你给出哲学家进餐问题的解决方案。

6. 写一段死锁代码。你在 Java 中如何解决死锁?

这是我最喜欢的 Java 多线程面试题,因为即使死锁在多线程并发编程中十分常见,许多面试者仍然抓耳挠腮,不能写出无死锁的代码。
只需要问他们如果有 N 个资源和 N 个线程去执行某个操作,然后请求所有资源。
这里的 N 可以是 2 作为最简单的情况,也可以是个很大的数字让问题变复杂。有关死锁的更多信息可以看这篇文章Java 中如何避免死锁

7. 什么是原子操作?Java 中有哪些原子操作?

这是个简单的 Java 线程面试题。另一个紧随其后的问题将是:你需要同步原子操作吗?你可以看这篇文章了解更多Java 同步

8. Java 中 volatile 关键字是什么?你如何使用它?它和 Java 中的同步方法有什么区别?

自从 Java 5 中调整 volatile 关键字和 Java 内存模型后,有关 volatile 关键字的线程问题越来越常见。掌握 volatile变量在并发环境中如何确保可见性、有序性和一致性非常重要。

9. 什么是竞态条件?你如何发现并解决竞态条件?

这个 Java 多线程问题一般出现在高级面试。多数面试官会问你最近一次遇到的竞态条件,如何解决的,有时他们也会写点简单代码让你发现竞态条件。可以看看我的这篇文章Java 中的竞态条件。我认为,这是最棒的 Java 线程面试问题之一,而且可以测试出面试者解决竞态条件的经验,或是编写无数据竞争、无其竞态条件的代码经验。

10. 在 Java 中你如何转储线程(thread dump)?如何分析它?

在 UNIX 中,你可以使用 kill -3 然后线程转储日志会打印在屏幕上,可以使用 CTRL+Break 查看。这只是一个较简单的线程面试题,狡猾一点的话他们会问你如何分析转储日志。线程转储日志对于分析死锁情况非常有用。

11. 既然 start() 方法会调用 run() 方法,为什么我们调用 start() 方法,而不直接调用 run() 方法?

这是一个基本的 Java 多线程面试题。最初,我刚开始多线程编程时对此还有些困惑。如今我一般在 Java 中级面试的电话面试或一轮面试中遇到。
这道问题的答案是这样的。当你调用 start() 方法时,它会新建一个线程然后执行 run() 方法中的代码。如果直接调用 run() 方法,并不会创建新线程,方法中的代码会在当前调用者的线程中执行。可以看这篇文章了解更多线程中 Start 和 Run 方法的区别

12. Java 中你如何唤醒阻塞线程?

这是有关线程的一个很狡猾的问题。有很多原因会导致阻塞,如果是 IO 阻塞,我认为没有方式可以中断线程(如果有的话请告诉我)。另一方面,如果线程阻塞是由于调用了 wait()sleep() 或 join() 方法,你可以中断线程,通过抛出 InterruptedException 异常来唤醒该线程。可以看这篇文章了解有关处理阻塞线程的知识Java 中如何处理阻塞方法

13. Java 中 CyclicBarriar 和 CountdownLatch 有什么区别?

最近的 Java 线程面试题多数在测试你对 JDK 5 并发包的掌握程度。两者区别之一就是 CyclicBarrier 在屏障打开之后(所有线程到达屏障点),可以重复使用。而 CountDownLatch 不行。想了解更多可以参与课程Java 中的多线程和并行计算

14. 什么是不可变类?它对于编写并发应用有何帮助?

尽管这道面试题和线程没有直接关系,但间接影响也很大。如果面试官随后让你写一个不可变类,或问你为什么 Java 中的 String 是不可变的,会让面试题变得更加复杂。

15. 你在多线程环境中遇到的最多的问题是什么?你如何解决的?

内存干扰、竞态条件、死锁、活锁、线程饥饿是多线程和并发编程中比较有代表性的问题。这类问题无休无止,而且难于定位和调试。
这是基于经验给出的 Java 面试题。你可以看看Java 并发实战课程来了解现实生活中高性能多线程应用所面临的问题。

上面所说的是我喜欢的,也是投行最常问的 Java 线程面试题。这个清单并不完整,所以可以在下方评论出你在面试中遇到的有意思的 Java 线程题目。这篇文章收集并分享与多线程概念有关的面试题,不仅仅有助于面试,还为大家打开多线程概念的大门。

 

 

原文链接: https://dzone.com/articles/top-15-java-multithreading-concurrency-interview-q

翻译: ImportNew.com - 一杯哈希不加盐

译文链接: http://www.importnew.com/29562.html

作者:小D课堂
来源链接:https://www.cnblogs.com/xdclass/p/9770742.html

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/java/42030.html

标签: Java面试题
分享给朋友:

“Java面试:投行的15个多线程和并发面试题” 的相关文章

经典java面试题(详细)

经典java面试题(详细)

经典Java面试题收集(一) 转载于:https://www.jianshu.com/p/c01eb6e46226 categories: Interviewdescription: 本文收集了一些经典的Java面试题...

Java高级面试题整理(附答案)

这是我收集的10道高级Java面试问题列表。这些问题主要来自 Java 核心部分 ,不涉及 Java EE 相关问题。你可能知道这些棘手的 Java 问题的答案,或者觉得这些不足以挑战你的 Java 知识,但这些问题都是容易在各种 Java 面试中被问到...

100道Java高频面试题(阿里面试官整理)

100道Java高频面试题(阿里面试官整理)

我分享文章的时候,有个读者回复说他去年就关注了我的微信公众号,打算看完我的所有文章,然后去面试,结果我后来很长时间不更新了。。。所以为了弥补一直等我的娃儿们,给大家的金三银四准备了100道花时间准备的高频Java面试题,大家不要太感动,记得点赞...

Java社招最全面试题,转疯了!

Java社招最全面试题,转疯了!

前言 设计模式是我们编程道路上绕不开的一环,用好了设计模式能够让代码拥有良好的维护性、可读性以及扩展性,它仿佛就是“优雅”的代名词,各个框架和库也都能见到它的身影。 正是因为它有种种好处,所以很多人在开发时总想将某个设计模式用到项目中来,然而...

[ImportNew]Java线程面试题

[ImportNew]Java线程面试题

Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎。大多数待遇丰厚的Java开发职位都要求开发者精通多线程技术并且有丰富的Java程序开发、调试、优化经验,所以线程相关的问题在面试中经常会被提到。  在典型的Java面试中, 面试官会从线...

最新最全的Java面试题整理(内附答案)

最新最全的Java面试题整理(内附答案)

Java基础知识篇 面向对象和面向过程的区别 面向过程:   优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。...

Java高级开发工程师面试题

Java高级开发工程师面试题

对于高级工程师来讲,自身的技术修为尤为重要,比如算法、设计模式、底层原理等,只有把这些基础熟练之后,才能在开发过程中知其然知其所以然,出现问题时达到得心应手。接下来与大家一起分享Java高级工程师面试的一些经验之谈。 Memcache与Redis的区别 mem...

java面试app

java面试app

java面试题库app是一款专为正在找工作的java程序员打造的软件,这款软件集合了精选的Java面试笔试题目及答案,致力于帮助用户通过面试和笔试,有需要的朋友快来下载吧。 java面试题库app特色 1、java基础(全面的java基础面试题...

java面试题——单例模式5道常见面试题

java面试题——单例模式5道常见面试题

序号 链接地址 1 java面试题:Redis常见面试题(实际面试有被问到) 2 java面试题:Spring核心面试题(必须理解背诵)...

Java面试题总结

Java面试题总结

Java基础: 1、JAVA中能创建volatile数组吗?volatile能使得一个非原子操作变成原子操作吗? 回答: 能,Java 中可以创建 volatile 类型数组,不过只是一个指向数组的引用,而不是整个数组。Java 中读取 long 类型变量不是原子的,需要分...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。