转自:http://www.importnew.com/29562.html
总之不要考虑那么多,下面是各种投行,比如巴克莱银行(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 线程题目。这篇文章收集并分享与多线程概念有关的面试题,不仅仅有助于面试,还为大家打开多线程概念的大门。
有位读者提供了一些 Java 线程面试题。补充在下面:
Executor
框架比直接创建线程要好?Executor
和 Executors
的区别?答案