热门搜索 :
考研考公
您的当前位置:首页正文

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

来源:东饰资讯网

多线程和并发问题已成为各种 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 中 waitsleep 方法有什么区别?

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

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

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

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

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

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

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

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

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

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

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

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

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

13. Java 中 CyclicBarriarCountdownLatch 有什么区别?

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

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

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

来源: ImportNew - 一杯哈希不加盐

稿定设计导出-20180808-123937.png
Top