多线程和并发问题已成为各类 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的文章。
苏州软件定制开拓 然抓耳挠腮" class="aligncenter size-full wp-image-29563" title="68747470733a2f2f322e62702e626c6f6773706f742e636f6d2f2d6731745f415f6e3761536b2f57707650446258733262492f41414141414141414b38452f584f7136665f36625739553235584d5f5669585f79624f51383579357448686941434c63424741732f733430302f536c656570253242767325" src="/uploads/allimg/c180824/15350544LQ0P-1aZ.gif" />
4. 如安在 Java 中实现一个阻塞行列?
这是一道相对坚苦的 Java 多线程口试题,考查点许多。它考查了口试者是否真正写过 Java 多线程代码,考查了口试者对并发场景的领略。而且可以按照口试者的代码问许多后续问题,假如他用 wait()
和 notify()
要领乐成实现了阻塞行列,可以让他用 Java 5 的并发类从头实现一次。
5. 如安在 Java 中编写代码办理出产者消费者问题?谜底
和上面有关线程的问题相似,这个问题在事情中很典范,但有时口试官会问这类问题,好比“在 Java 中如何办理出产者消费者问题?”其实,有许多办理方法。我分享过用 Java 中 BlockingQueue 的办理方案。有时他们甚至会让你给出哲学家进餐问题的办理方案。
6. 写一段死锁代码。你在 Java 中如何办理死锁?
这是我最喜欢的 Java 多线程口试题,因为纵然死锁在多线程并发编程中十分常见,很多口试者仍然抓耳挠腮,不能写出无死锁的代码。
只需要问他们假如有 N 个资源和 N 个线程去执行某个操纵,然后请求所有资源。
这里的 N 可以是 2 作为最简朴的环境,也可以是个很大的数字让问题变巨大。有关死锁的更多信息可以看这篇文章Java 中如何制止死锁。