多线程和并发题是任何Java面试必不可少的部分。如果你想在任何一家股权投资银行获得前台信息职位,那么你应该准备很多关于多线程的问题。多线程和并发是投资银行业中非常流行的话题,特别是因为它涉及到电子交易的发展。他们会问面试官很多令人困惑的Java线程问题。面试官只是想确保面试官对Java线程和并发有足够的了解,因为很多应聘者只是肤浅。用于直接市场交易的高容量和低延迟电子交易系统本质上是并发的。下面是一些我喜欢在不同时间和地点提出的Java线程问题。我不提供答案,但只要有可能我就会给你线索,有时这些线索足以回答问题。现在引用Java5并发包,关于并发工具和并发集合的问题越来越多。在这些问题中,ThreadLocal、BlockingQueue、CountingSemaphore和ConcurrentHashMap比较流行。注:文末有福利,记得领取哦!15道Java多线程面试题及答案1)现在有三个线程T1、T2、T3。如何保证T1执行完后T2执行,T2执行完后T3执行?这个线程问题通常在第一轮或电话面试阶段被问到,以测试您对“加入”方法的熟悉程度。这个多线程问题比较简单,用join方法就可以实现。2)Lock接口相对于Java中同步块的优势是什么?您需要实现一个高效的缓存,允许多个用户读取但只有一个用户写入以保持其完整性,您将如何实现它?锁接口在多线程和并发编程中最大的优势就是分别提供读和写的锁,可以满足你写像ConcurrentHashMap、条件阻塞这样的高性能数据结构。越来越多的Java线程面试问题是根据面试者的回答提出的。我强烈建议您在参加多线程面试之前先阅读Locks,因为它目前大量用于为电子交易系统构建客户端缓存和交易连接空间。3)java中wait和sleep方法有什么区别?电话面试中经常被问到的Java线程面试题。最大的区别是wait在等待的时候释放锁,而sleep一直持有锁。wait通常用于线程间的交互,sleep通常用于暂停执行。4)用Java实现阻塞队列。这是一个相对棘手的多线程面试问题,有多种用途。首先,它可以测试候选人是否真的可以用Java线程编写程序;第二,可以考查考生对并发场景的理解,可以根据这个提很多问题。如果他用wait()和notify()方法实现了阻塞队列,你可以让他用最新的Java5并发类再写一遍。5)用Java写代码解决生产者消费者问题。和上面的题很像,但是这个题更经典。有时面试会问以下问题。Java中如何解决生产者消费者问题,当然有很多解决方法,我分享过一个用阻塞队列实现的方法。有时他们甚至会问如何解决哲学家就餐问题。6)用Ja??va编写一个会导致死锁的程序,你将如何解决它?这是我最喜欢的Java线程面试题,因为尽管死锁问题在编写多线程并发程序时非常常见,但很多应聘者写不出死锁自由代码(deadlock-freecode?),并且苦苦挣扎。只要告诉他们,你有N个资源,N个线程,你需要它们全部来完成一个操作。为了简单起见,这里的n可以换成2,数据越大,问题看起来越复杂。通过避免Java中的死锁了解有关死锁的更多信息。7)什么是原子操作,什么是Java中的原子操作?很简单的java线程面试题,下一道题是你需要同步一个原子操作。8)Java中volatile键的作用是什么?如何使用它与Java中的同步方法有何不同?自从Java5和Java内存模型发生变化后,基于volatile关键字的线程问题变得越来越流行。准备好回答有关可变变量如何确保并发环境中的可见性、顺序和一致性的问题。9)什么是竞争条件?您如何发现和解决竞争?这是在多线程面试的高级阶段出现的问题。大多数面试官会询问您最近遇到的竞争条件以及您是如何解决的。有时他们会编写简单的代码并让您检测代码中的竞争条件。可以参考我之前写的Java竞争条件的文章。在我看来,这是最好的Java线程面试问题之一,它可以准确地检测候选人在解决竞争条件或编写没有数据竞争或任何其他竞争条件的代码方面的经验。关于这个主题的最好的书是《Concurrency practices in Java》。10)你将如何使用线程转储?您将如何分析线程转储?在UNIX中您可以使用kill-3,threaddump将打印日志,在windows中您可以使用“CTRL+Break”。很简单很专业的threading面试题,但是如果他问你怎么分析就比较棘手了。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中的concurrent包。两者的区别在于CyclicBarrier可以复用已经通过的障碍物,而CountdownLatch则不能。14)什么是不可变对象,它如何帮助编写并发应用程序?又一道经典的多线程面试题,和线程没有直接关系,但间接帮助很大。这个java面试题如果让你写一个不可变的对象,或者问你为什么String是不可变的,就会变得非常棘手。15)你在多线程环境中遇到的常见问题是什么?你是怎么解决的?多线程和并发程序中经常遇到的是内存接口、竞争条件、死锁、活锁和饥饿。问题层出不穷,一旦出错,就很难发现和调试。这主要是基于面试的,而不是基于实际应用程序的Java线程问题。补充几个问题:1)java中的greenthreads和localthreads有什么区别?2)线程和进程有什么区别?3)什么是多线程中的上下文切换?4)死锁和活锁、死锁和馅饼的区别?5)Java中使用的线程调度算法是什么?6)Java中的线程调度是什么?7)如何处理线程中无法捕获的异常?8)什么是线程组,为什么它在Java中被弃用?9)为什么使用Executor框架比使用应用程序创建和管理线程更好?10)Java中Executor和Executors的区别?11)如何在Windows和Linux上找到哪个线程使用最多的CPU时间?资料推荐作为阅读福利,我整理了一些多线程的相关资料(包括脑图、手写PDF、面试真题等),现免费分享给阅读本文的Java程序员。如果您需要它们,可以点击此处]获取!以下是部分展示视频资料、书籍资料核心知识点的信息。
