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的文章。
4. 怎样在 Java 中完成一个壅塞行列?
这是一道相对难题的 Java 多线程口试题,考核点很多。它考核了口试者是不是真正写过 Java 多线程代码,考核了口试者对并发场景的明白。而且能够依据口试者的代码问很多后续题目,假如他用 wait() 和 notify() 要领胜利完成了壅塞行列,能够让他用 Java 5 的并发类从新完成一次。
5. 怎样在 Java 中编写代码处理生产者消费者题目?
答案和上面有关线程的题目类似,这个题目在工作中很典范,但偶然口试官会问这类题目,比方“在 Java 中怎样处理生产者消费者题目?”实在,有很多处理体式格局。我分享过用 Java 中 BlockingQueue 的处理方案。偶然他们甚至会让你给出哲学家进餐题目的处理方案。
6. 写一段死锁代码。你在 Java 中怎样处理死锁?
这是我最喜欢的 Java 多线程口试题,因为纵然死锁在多线程并发编程中非常罕见,很多口试者依然抓耳挠腮,不能写出无死锁的代码。
只须要问他们假如有 N 个资本和 N 个线程去实行某个操纵,然后要求一切资本。
这里的 N 能够是 2 作为最简朴的状况,也能够是个很大的数字让题目变庞杂。
7. 什么是原子操纵?Java 中有哪些原子操纵?
这是个简朴的 Java 线程口试题。另一个紧随其后的题目将是:你须要同步原子操纵吗?你能够看这篇文章相识更多Java 同步。
8. Java 中 volatile 关键字是什么?你怎样运用它?它和 Java 中的同步要领有什么区分?
自从 Java 5 中调解 volatile 关键字和 Java 内存模子后,有关 volatile 关键字的线程题目愈来愈罕见。控制 volatile变量在并发环境中怎样确保可见性、有序性和一致性异常重要。
9. 什么是竞态前提?你怎样发明并处理竞态前提?
这个 Java 多线程题目平常出现在高等口试。多半口试官会问你近来一次碰到的竞态前提,怎样处理的,偶然他们也会写点简朴代码让你发明竞态前提。能够看看我的这篇文章Java 中的竞态前提。我以为,这是最棒的 Java 线程口试题目之一,而且能够测试出口试者处理竞态前提的履历,或是编写无数据合作、无其竞态前提的代码履历。
10. 在 Java 中你怎样转储线程(thread dump)?怎样剖析它?
在 UNIX 中,你能够运用 kill -3 然后线程转储日记会打印在屏幕上,能够运用 CTRL+Break 检察。这只是一个较简朴的线程口试题,桀黠一点的话他们会问你怎样剖析转储日记。线程转储日记关于剖析死锁状况异常有效。
11. 既然 start() 要领会挪用 run() 要领,为何我们挪用 start() 要领,而不直接挪用 run() 要领?
这是一个基础的 Java 多线程口试题。最初,我刚开始多线程编程时对此还有些疑心。现在我平常在 Java 中级口试的电话口试或一轮口试中碰到。
这道题目的答案是如许的。当你挪用 start() 要领时,它会新建一个线程然后实行 run() 要领中的代码。假如直接挪用 run() 要领,并不会建立新线程,要领中的代码会在当前挪用者的线程中实行。
12. Java 中你怎样叫醒壅塞线程?
这是有关线程的一个很桀黠的题目。有很多缘由会致使壅塞,假如是 IO 壅塞,我以为没有体式格局能够中断线程(假如有的话请告诉我)。另一方面,假如线程壅塞是因为挪用了 wait(),sleep() 或 join() 要领,你能够中断线程,经由过程抛出 InterruptedException 异常来叫醒该线程。
13. Java 中 CyclicBarriar 和 CountdownLatch 有什么区分?
近来的 Java 线程口试题多半在测试你对 JDK 5 并发包的控制水平。二者区分之一就是 CyclicBarrier 在屏蔽翻开以后(一切线程抵达屏蔽点),能够重复运用。而 CountDownLatch 不可。想相识更多能够介入课程Java 中的多线程和并行计算。
14. 什么是不可变类?它关于编写并发运用有何协助?
只管这道口试题和线程没有直接关系,但间接影响也很大。假如口试官随后让你写一个不可变类,或问你为何 Java 中的 String 是不可变的,会让口试题变得越发庞杂。
15. 你在多线程环境中碰到的最多的题目是什么?你怎样处理的?
内存滋扰、竞态前提、死锁、活锁、线程饥饿是多线程和并发编程中比较有代表性的题目。这类题目无休无止,而且难于定位和调试。
以上就是15个Java线程并发口试题和答案的细致内容,更多请关注ki4网别的相干文章!