在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分。如果你想取得任何股票投资银行的前台资讯职位,那么你应该筹备很多对于多线程的问题。在投资银行业务中多线程和并发是一个十分受欢迎的话题,特地是电子交易倒退方面相干的。他们会问面试者很多令人混同的Java线程问题。面试官只是想确信面试者有足够的Java线程与并发方面的常识,因为候选人中有很多只浮于外表。用于间接面向市场交易的高容量和低延时的电子交易系统在实质上是并发的。上面这些是我在不同工夫不同地点喜爱问的Java线程问题。我没有提供答案,但只有可能我会给你线索,有些时候这些线索足够答复问题。当初援用Java5并发包对于并发工具和并发汇合的问题正在增多。那些问题中ThreadLocal、Blocking Queue、Counting Semaphore和ConcurrentHashMap比拟风行。
注:文末有福利,记得支付!
15个Java多线程面试题及答复
1)当初有T1、T2、T3三个线程,你怎么保障T2在T1执行完后执行,T3在T2执行完后执行?
这个线程问题通常会在第一轮或电话面试阶段被问到,目标是检测你对”join”办法是否相熟。这个多线程问题比较简单,能够用join办法实现。
2)在Java中Lock接口比synchronized块的劣势是什么?你须要实现一个高效的缓存,它容许多个用户读,但只容许一个用户写,以此来放弃它的完整性,你会怎么去实现它?
lock接口在多线程和并发编程中最大的劣势是它们为读和写别离提供了锁,它能满足你写像ConcurrentHashMap这样的高性能数据结构和有条件的阻塞。Java线程面试的问题越来越会依据面试者的答复来发问。我强烈建议在你去加入多线程的面试之前认真读一下Locks,因为以后其大量用于构建电子交易终统的客户端缓存和交易连贯空间。
3)在java中wait和sleep办法的不同?
通常会在电话面试中常常被问到的Java线程面试问题。最大的不同是在期待时wait会开释锁,而sleep始终持有锁。Wait通常被用于线程间交互,sleep通常被用于暂停执行。
4)用Java实现阻塞队列。
这是一个绝对艰巨的多线程面试问题,它能达到很多的目标。第一,它能够检测侯选者是否能理论的用Java线程写程序;第二,能够检测侯选者对并发场景的了解,并且你能够依据这个问很多问题。如果他用wait()和notify()办法来实现阻塞队列,你能够要求他用最新的Java 5中的并发类来再写一次。
5)用Java写代码来解决生产者——消费者问题。
与下面的问题很相似,但这个问题更经典,有些时候面试都会问上面的问题。在Java中怎么解决生产者——消费者问题,当然有很多解决办法,我曾经分享了一种用阻塞队列实现的办法。有些时候他们甚至会问怎么实现哲学家进餐问题。
6)用Java编程一个会导致死锁的程序,你将怎么解决?
这是我最喜爱的Java线程面试问题,因为即便死锁问题在写多线程并发程序时十分广泛,然而很多侯选者并不能写deadlock free code(无死锁代码?),他们很挣扎。只有通知他们,你有N个资源和N个线程,并且你须要所有的资源来实现一个操作。为了简略这里的n能够替换为2,越大的数据会使问题看起来更简单。通过防止Java中的死锁来失去对于死锁的更多信息。
7) 什么是原子操作,Java中的原子操作是什么?
非常简单的java线程面试问题,接下来的问题是你须要同步一个原子操作。
8) Java中的volatile要害是什么作用?怎么应用它?在Java中它跟synchronized办法有什么不同?
自从Java 5和Java内存模型扭转当前,基于volatile关键字的线程问题越来越风行。应该筹备好答复对于volatile变量怎么在并发环境中确保可见性、程序性和一致性。
9) 什么是竞争条件?你怎么发现和解决竞争?
这是一道呈现在多线程面试的高级阶段的问题。大多数的面试官会问最近你遇到的竞争条件,以及你是怎么解决的。有些工夫他们会写简略的代码,而后让你检测出代码的竞争条件。能够参考我之前公布的对于Java竞争条件的文章。在我看来这是最好的java线程面试问题之一,它能够确切的检测候选者解决竞争条件的教训,or writing code which is free of data race or any other race condition。对于这方面最好的书是《Concurrency practices in Java》。
10) 你将如何应用thread dump?你将如何剖析Thread dump?
在UNIX中你能够应用kill -3,而后thread dump将会打印日志,在windows中你能够应用”CTRL+Break”。非常简单和业余的线程面试问题,然而如果他问你怎么剖析它,就会很辣手。
11) 为什么咱们调用start()办法时会执行run()办法,为什么咱们不能间接调用run()办法?
这是另一个十分经典的java多线程面试问题。这也是我刚开始写线程程序时候的困惑。当初这个问题通常在电话面试或者是在初中级Java面试的第一轮被问到。这个问题的答复应该是这样的,当你调用start()办法时你将创立新的线程,并且执行在run()办法里的代码。然而如果你间接调用run()办法,它不会创立新的线程也不会执行调用线程的代码。浏览我之前写的《start与run办法的区别》这篇文章来取得更多信息。
12) Java中你怎么唤醒一个阻塞的线程?
这是个对于线程和阻塞的辣手的问题,它有很多解决办法。如果线程遇到了IO阻塞,我并且不认为有一种办法能够停止线程。如果线程因为调用wait()、sleep()、或者join()办法而导致的阻塞,你能够中断线程,并且通过抛出InterruptedException来唤醒它。我之前写的《How to deal with blocking methods in java》有很多对于解决线程阻塞的信息。
13)在Java中CycliBarriar和CountdownLatch有什么区别?
这个线程问题次要用来检测你是否相熟JDK5中的并发包。这两个的区别是CyclicBarrier能够重复使用曾经通过的阻碍,而CountdownLatch不能重复使用。
14) 什么是不可变对象,它对写并发利用有什么帮忙?
另一个多线程经典面试问题,并不间接跟线程无关,但间接帮忙很多。这个java面试问题能够变的十分辣手,如果他要求你写一个不可变对象,或者问你为什么String是不可变的。
15) 你在多线程环境中遇到的独特的问题是什么?你是怎么解决它的?
多线程和并发程序中常遇到的有Memory-interface、竞争条件、死锁、活锁和饥饿。问题是没有止境的,如果你弄错了,将很难发现和调试。这是大多数基于面试的,而不是基于理论利用的Java线程问题。
补充的其它几个问题:
- 1)在java中绿色线程和本地线程区别?
- 2)线程与过程的区别?
- 3)什么是多线程中的上下文切换?
- 4)死锁与活锁的区别,死锁与馅饼的区别?
- 5)Java中用到的线程调度算法是什么?
- 6)在Java中什么是线程调度?
- 7)在线程中你怎么解决不可捕获异样?
- 8)什么是线程组,为什么在Java中不举荐应用?
- 9)为什么应用Executor框架比应用利用创立和治理线程好?
- 10)在Java中Executor和Executors的区别?
- 11)如何在Windows和Linux上查找哪个线程应用的CPU工夫最长?
材料举荐
作为浏览福利,我整顿了一些多线程的相干材料(蕴含脑图、手写PDF、面试真题等),当初收费分享给浏览到本篇文章的Java程序员敌人们,须要的可【点击此处】支付!上面为局部材料展现
视频材料
书籍材料
外围知识点
高频面试题
大厂面试真题
须要更多Java学习笔记+面试真题可【点击此处】获取!