你可能会碰到的15个高级Java多线程面试题及回答


多线程和并发问题是任何Java面试的重要组成部分。如果你想在任何一家股票投资银行获得前台信息职位,你应该准备很多关于多线程的问题。多线程和并发是投资银行中非常流行的话题,特别是在电子交易的发展中。他们向面试官询问许多令人困惑的Java线程问题。面试官只是想确保面试官对Java线程和并发有足够的知识,因为很多应聘者都是肤浅的。面向市场的直接交易的高容量和低延迟电子交易系统基本上是并行的。这些是我喜欢在不同的时间和地点问的Java线程问题。我不提供答案,但只要我能给你线索,有时它们就足以回答问题。参考Java 5并发包现在在并发工具和并发集合方面正在兴起。在这些问题中,线程局部、阻塞队列、计数信号量和并发散列映射是最流行的。

十五Java多线程面试问题及答案

1)现在有三个线程:T1、T2和T3。如何确保t2在t1之后执行,t3在t2之后执行?

这个线程问题通常在第一轮或电话采访中被问到,以测试您对连接方法的熟悉程度。这个多线程问题相对简单,可以通过join方法实现。

2)在Java中同步块的锁接口有哪些优点?您需要实现一个高效的缓存,允许多个用户读取,但只允许一个用户写入,以保持其完整性。你如何实现它?

锁接口在多线程和并发编程中的最大优点是它们分别为读和写提供锁。它们可以满足并发哈希图和条件阻塞等高性能数据结构。Java线程越来越多地根据面试官的回答提出问题。我强烈建议您在进行多线程访问之前仔细阅读锁,因为它们目前大量用于为电子商务终端系统构建客户端缓存和事务连接空间。

3)Java中等待和休眠方法的区别?

在电话面试中经常被问及的Java线程面试问题。最大的区别是等待时释放锁,而睡眠则一直保持锁。wait通常用于线程间的交互,sleep通常用于暂停执行。

4)在Java中实现阻塞队列。

这是一个比较困难的多线程面试问题,可以实现很多目标。首先,它可以检测考生是否可以在Java线程中实际编写程序;第二,它可以检测候选对象对并发场景的理解,并且可以在此基础上提出许多问题。如果他使用等待()和通知()方法来实现阻塞队列,则可以要求他在最新的Java 5中用并发类重新编写队列。

5)编写Java代码解决生产者-消费者问题。

类似于上述问题,但这个问题比较经典,有时面试会问以下问题。当然,如何解决Java中的生产者-消费者问题有很多解决方案。我共享了一种方法来实现阻塞队列。有时他们甚至会问如何认识哲学家的晚餐。

6)在Java中编程死锁导致程序,您将如何解决它?

这是我最喜欢的Java线程访问问题,因为即使在编写多线程并发程序时死锁问题是常见的,许多候选程序也不能编写无死锁的代码。他们在挣扎。只需告诉他们您有N个资源和N个线程,并且您需要所有资源来完成一个操作。为了简单起见,n可以替换为2。数据越大,问题就越复杂。通过避免Java中的死锁来获取死锁的更多信息。

7)原子操作是什么,原子操作是什么?

非常简单的Java线程面试问题,下一个问题是需要同步原子操作。

8)Java中易失性的关键是什么?如何使用?它与Java中的同步方法有什么不同?

由于Java 5和Java内存模型的改变,基于关键字的易失性线程已经变得越来越流行。您应该准备好回答有关可变变量如何确保并发环境中的可见性、顺序性和一致性的问题。

9)竞争条件是什么?你如何发现和解决竞争?

这是一个出现在多线程面试高级阶段的问题。大多数面试官都会问你最近遇到的竞争情况,以及你是如何解决这些问题的。有时他们会编写简单的代码,让您检测代码的竞争条件。请参考我以前关于Java竞争条件的文章。在我看来,这是一个最好的Java线程面试问题,它可以准确地检测候选人的经验,在解决竞争条件,或编写代码,无数据竞争或任何其他种族条件。这方面最好的书是Java中的并发操作。

10)如何使用线程转储?如何分析线程转储?

在UNIX中,可以使用kill-3,然后线程转储将打印日志,在Windows中可以使用ctrl+break。非常简单和专业的线程面试问题,但如果他问你如何分析它,这将是棘手的。

11)当我们调用start()方法时,为什么要执行run()方法?为什么不能直接调用run()方法?

这是另一个非常经典的Java多线程面试问题。这就是我开始编写线程程序时的困惑。现在这个问题通常在电话面试或第一轮的中级Java面试中被问到。这个问题的答案是,当调用start()方法时,创建一个新线程并在run()方法中执行代码。但是,如果直接调用run()方法,它将不会创建新线程或执行调用线程的代码。有关详细信息,请阅读我以前的文章“Start和Run方法之间的区别”。

12)如何在Java中唤醒阻塞的线程?

这对于线程和阻塞来说是一个棘手的问题,它有许多解决方案。如果线程遇到IO阻塞,我认为没有办法中止线程。如果线程被调用wait()、sleep()或join()阻塞,则可以中断该线程并通过抛出interruptedException将其唤醒。如何处理我前面写的Java中的阻塞方法,有很多关于处理线程阻塞的信息。

13)CycliBarriar和倒计时锁在Java中的区别是什么?

这个线程问题主要用于检测您是否熟悉JDK5中的并发包。两者的区别在于循环障碍物可以重复使用已经通过的障碍物,而倒计时锁存器则不能。

14)什么是不可变对象,它如何帮助编写并发应用程序?

另一个经典的多线程面试问题与线程没有直接关系,但间接帮助了很多。如果他要求你写一个不可变的对象,或者问为什么字符串是不可变的,这个Java面试问题可能会非常棘手。

15)您在多线程环境中遇到的常见问题是什么?你是怎么解决的?

在多线程和并发程序中,内存接口、竞争条件、死锁、活动锁和匮乏是常见的。问题是无穷无尽的。如果您犯了错误,将很难找到和调试。这主要是基于面试的,而不是基于Java应用程序的实际线程问题。

猜你喜欢

转载自blog.csdn.net/qq_41552245/article/details/87884635