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

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

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

有一些 Java 线程面试题是我特别中意的。我并不会直接给你答案,而是尽量给你指点。我会以后补充上详细答案,正如我在其余文章中那样。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. 如今有线程 T一、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

相关文章
相关标签/搜索