动力节点口口相传的Java黄埔军校
2019年最新简单的Java面试题
2019-09-06 来源:动力节点

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


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


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


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


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


Java常见面试题汇总.jpg


  15个Java线程面试题和答案


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


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


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


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


  多线程和并发编程中使用lock接口的最大优势是它为读和写提供两个单独的锁,可以让你构建高性能数据结构,比如ConcurrentHashMap和条件阻塞。


  这道Java线程面试题越来越多见,而且随后的面试题都基于面试者对这道题的回答。


  我强烈建议在任何Java多线程面试前都要多看看有关锁的知识,因为如今电子交易系统的客户端和数据交互中,锁被频繁使用来构建缓存。


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


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

image.png

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


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


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


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


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


  这是我最喜欢的Java多线程面试题,因为即使死锁在多线程并发编程中十分常见,许多面试者仍然抓耳挠腮,不能写出无死锁的代码。


  只需要问他们如果有N个资源和N个线程去执行某个操作,然后请求所有资源。


  这里的N可以是2作为最简单的情况,也可以是个很大的数字让问题变复杂。


image.png

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


  这是个简单的Java线程面试题。另一个紧随其后的问题将是:你需要同步原子操作吗?


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


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


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


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


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


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


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


  这是一个基本的Java多线程面试题。最初,我刚开始多线程编程时对此还有些困惑。如今我一般在Java中级面试的电话面试或一轮面试中遇到。


  这道问题的答案是这样的。当你调用start()方法时,它会新建一个线程然后执行run()方法中的代码。如果直接调用run()方法,并不会创建新线程,方法中的代码会在当前调用者的线程中执行。

image.png

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


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


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


  最近的Java线程面试题多数在测试你对JDK5并发包的掌握程度。两者区别之一就是CyclicBarrier在屏障打开之后(所有线程到达屏障点),可以重复使用。而CountDownLatch不行。


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


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


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


  内存干扰、竞态条件、死锁、活锁、线程饥饿是多线程和并发编程中比较有代表性的问题。这类问题无休无止,而且难于定位和调试。


  这是基于经验给出的Java面试题。


  上面所说的都是投行最常问的Java线程面试题。这个清单并不完整,需要更全方面的Java面试题可以登录动力节点IT培训官网。


开班信息

同类文章

微信搜索“动力节点Java学院“或扫二维码

关注官方微信免费领学习资料

动力节点Java培训机构,行业口碑最好的Java培训机构。

立即抢名额