多线程和并发问题已成为各类 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 年还将持续。从此你也应该对这些知识点有所准备。编程
总之不要考虑那么多,下面是各类投行,好比巴克莱银行(Barclays)、花旗银行(Citibank)、摩根史坦利投资公司(Morgan Stanley)等等,面试 Java 开发者时常问的 Java 多线程和并发问题。缓存
这个线程面试题一般在第一轮面试或电话面试时被问到,这道多线程问题为了测试面试者是否熟悉 join
方法的概念。答案也很是简单——能够用 Thread 类的 join
方法实现这一效果。数据结构
多线程和并发编程中使用 lock 接口的最大优点是它为读和写提供两个单独的锁,可让你构建高性能数据结构,好比 ConcurrentHashMap
和条件阻塞。
这道 Java 线程面试题愈来愈多见,并且随后的面试题都基于面试者对这道题的回答。
我强烈建议在任何 Java 多线程面试前都要多看看有关锁的知识,由于现在电子交易系统的客户端和数据交互中,锁被频繁使用来构建缓存。多线程
wait
和 sleep
方法有什么区别?咱们来看看另外一个常常被问到的线程面试题。这道题常出如今电话面试中。二者主要的区别就是等待释放锁和监视器。sleep
方法在等待时不会释听任何锁或监视器。wait
方法多用于线程间通讯,而 sleep
只是在执行时暂停。能够看我另外一篇有关Java 中 wait 和 sleep的文章。并发
这是一道相对困难的 Java 多线程面试题,考察点不少。它考察了面试者是否真正写过 Java 多线程代码,考察了面试者对并发场景的理解。而且能够根据面试者的代码问不少后续问题,若是他用 wait()
和 notify()
方法成功实现了阻塞队列,可让他用 Java 5 的并发类从新实现一次。工具
和上面有关线程的问题类似,这个问题在工做中很典型,但有时面试官会问这类问题,好比“在 Java 中如何解决生产者消费者问题?”其实,有不少解决方式。我分享过用 Java 中 BlockingQueue 的解决方案。有时他们甚至会让你给出哲学家进餐问题的解决方案。
这是我最喜欢的 Java 多线程面试题,由于即便死锁在多线程并发编程中十分常见,许多面试者仍然抓耳挠腮,不能写出无死锁的代码。
只须要问他们若是有 N 个资源和 N 个线程去执行某个操做,而后请求全部资源。
这里的 N 能够是 2 做为最简单的状况,也能够是个很大的数字让问题变复杂。有关死锁的更多信息能够看这篇文章Java 中如何避免死锁。
这是个简单的 Java 线程面试题。另外一个紧随其后的问题将是:你须要同步原子操做吗?你能够看这篇文章了解更多Java 同步。
volatile
关键字是什么?你如何使用它?它和 Java 中的同步方法有什么区别?自从 Java 5 中调整 volatile
关键字和 Java 内存模型后,有关 volatile
关键字的线程问题愈来愈常见。掌握 volatile
变量在并发环境中如何确保可见性、有序性和一致性很是重要。
这个 Java 多线程问题通常出如今高级面试。多数面试官会问你最近一次遇到的竞态条件,如何解决的,有时他们也会写点简单代码让你发现竞态条件。能够看看个人这篇文章Java 中的竞态条件。我认为,这是最棒的 Java 线程面试问题之一,并且能够测试出面试者解决竞态条件的经验,或是编写无数据竞争、无其竞态条件的代码经验。
在 UNIX 中,你可使用 kill -3
而后线程转储日志会打印在屏幕上,可使用 CTRL+Break
查看。这只是一个较简单的线程面试题,狡猾一点的话他们会问你如何分析转储日志。线程转储日志对于分析死锁状况很是有用。
start()
方法会调用 run()
方法,为何咱们调用 start()
方法,而不直接调用 run()
方法?这是一个基本的 Java 多线程面试题。最初,我刚开始多线程编程时对此还有些困惑。现在我通常在 Java 中级面试的电话面试或一轮面试中遇到。
这道问题的答案是这样的。当你调用 start()
方法时,它会新建一个线程而后执行 run()
方法中的代码。若是直接调用 run()
方法,并不会建立新线程,方法中的代码会在当前调用者的线程中执行。能够看这篇文章了解更多线程中 Start 和 Run 方法的区别。
这是有关线程的一个很狡猾的问题。有不少缘由会致使阻塞,若是是 IO 阻塞,我认为没有方式能够中断线程(若是有的话请告诉我)。另外一方面,若是线程阻塞是因为调用了 wait()
,sleep()
或 join()
方法,你能够中断线程,经过抛出 InterruptedException
异常来唤醒该线程。能够看这篇文章了解有关处理阻塞线程的知识Java 中如何处理阻塞方法。
CyclicBarriar
和 CountdownLatch
有什么区别?最近的 Java 线程面试题多数在测试你对 JDK 5 并发包的掌握程度。二者区别之一就是 CyclicBarrier
在屏障打开以后(全部线程到达屏障点),能够重复使用。而 CountDownLatch
不行。想了解更多能够参与课程Java 中的多线程和并行计算。
尽管这道面试题和线程没有直接关系,但间接影响也很大。若是面试官随后让你写一个不可变类,或问你为何 Java 中的 String 是不可变的,会让面试题变得更加复杂。
内存干扰、竞态条件、死锁、活锁、线程饥饿是多线程和并发编程中比较有表明性的问题。这类问题无休无止,并且难于定位和调试。
这是基于经验给出的 Java 面试题。你能够看看Java 并发实战课程来了解现实生活中高性能多线程应用所面临的问题。
上面所说的是我喜欢的,也是投行最常问的 Java 线程面试题。这个清单并不完整,因此能够在下方评论出你在面试中遇到的有意思的 Java 线程题目。这篇文章收集并分享与多线程概念有关的面试题,不只仅有助于面试,还为你们打开多线程概念的大门。
原文连接: https://dzone.com/articles/top-15-java-multithreading-concurrency-interview-q
翻译: ImportNew.com - 一杯哈希不加盐
译文连接: http://www.importnew.com/29562.html