最常见的15个Java多线程,并发面试问题

原文地址:https://dzone.com/articles/top-15-java-multithreading-concurrency-interview-q?oid=twitter
原作者: Javin Paul

想要了解常见的Java相关面试问题的更多信息?看完这篇文章可以了解有关投资银行最佳面试问题的更多信息。
多线程和并发问题是任何Java面试的重要组成部分。如果你要去投资银行面试,例如巴克莱,花旗银行,摩根士丹利为股票前端Java开发人员的职位,可以期待很多多线程的面试问题。多线程和并发是投资银行访谈的热门话题,尤其是电子交易开发工作,他们在许多棘手的Java线程面试问题上难住候选人。他们希望确保候选人对Java中的多线程和并发编程有扎实的了解,因为他们中大多数业务都和性能相关,这为他们提供了竞争优势。

例如,用于DMA交易的高容量和低延迟电子交易系统通常是并发的。大多数情况下,他们专注于微秒延迟,这就是为什么拥有如何有效地最小化延迟和提高吞吐量知识是如此重要。

这些是我最喜欢的关于Java的线程面试问题。我没有提供这些线程访谈问题的答案,但我会尽可能给你一个提示。我会更新帖子就详细的答案,就像我最近在Java中发布的10个Singleton面试问题一样。

15 Java Thread Interview Questions and answers

无论如何,这里是一些常见的Java多线程和并发问题列表,这些问题曾是Java开发人员面试投资银行时遇到的问题,例如: 巴克莱,摩根士丹利,花旗银行等

  1. 假设你有三个线程T1,T2,T3。你如何能保证线程T2在线程T1后运行,T3在T2后运行

    这个线程面试问题大多是在第一轮或电话筛选轮次中会被问到的,这个多线程问题的目的是检查候选人对“join”方法概念是否熟悉。这个多线程问题的答案很简单 - 可以通过使用Thread类的join方法来实现。

  2. 新的Lock接口较于Java中的同步块(synchronized block)有什么优势?您需要实现一个允许多读取的高性能缓存,但是如何实现单独写以保持完整性?

    lock接口在多线程和并发编程的主要优势是它提供了两个独立的读写锁,使你能够编写高性能数据结构,如ConcurrentHashMap和条件阻塞(conditional blocking)。

    这个Java线程面试问题越来越受欢迎,越来越多的后续提问问题基于面试者的回答。

    我强烈建议在任何Java多线程面试之前阅读锁,因为,现在,它大量用于为客户端上的电子交易系统构建缓存并交换连接空间。

  3. Java多线程中sleep和wait方法的区别
    让我们看一下Java中另一个经常被问到的线程面试问题。 这个问题经常会出现在电话面试.这两者的主要区别在于wait可以释放锁或监视器,而sleep在等待时不会释放任何锁或监视器。wait用于线程间通信,因为sleep用于在执行时引入暂停。有关详细信息,请参阅我的wait vs sleep in Java这篇帖子。

    最常见的15个Java多线程,并发面试问题_第1张图片

  4. 如何在Java中实现阻塞队列?
    这是一个相对困难的Java多线程面试问题,有很多用意。它可以确定候选人在实际工作中是否使用过线程编写Java代码。它可以看到候选人是否充分理解并发场景,你可以根据他的代码提出很多后续问题。如果他使用wait()和notify()方法来实现阻塞队列,一旦候选者成功写出它,你可以让他再次使用新的Java 5并发类等来编写它。

  5. 在Java中如何解决生产者消费者问题? (solution)
    与上面的线程问题类似,这个问题本质上更经典,但有时候面试官会进一步问问题,比如“你如何解决Java中的生产者消费者问题?”它可以通过多种方式解决。我已经分享了一种使用Java中的BlockingQueue来解决生产者 - 消费者问题的方法,所以要准备好接受一些惊喜。有时候,他们甚至会要求你实现一个解决哲学家进餐问题的解决方案。

  6. 编写一个会导致死锁的程序。你将如何解决Java中的死锁问题?
    这是我最感兴趣的java面试问题,因为,尽管在编写多线程并发程序时死锁很常见,但许多候选人都无法编写无死锁代码,而且他们很挣扎。
    只要询问他们是否有N个资源和N个线程来完成操作;那么,你需要所有的资源。
    用N来替换最简单的情况和更高的数字这两种情况,以使问题更加令人生畏。有关死锁的更多信息,请参见How to avoid deadlock in Java 。
    最常见的15个Java多线程,并发面试问题_第2张图片

  7. 什么是原子操作?什么是Java中的原子操作?

    这是一个简单的Java线程访谈问题。另一个后续问题是:你需要同步原子操作吗?你可以阅读更多 Java synchronization.

  8. 什么是Java中的volatile关键字?你如何使用它?它与Java中的synchronized方法有什么不同?
    在对Java 5和Java内存模型进行更改之后,基于Java中的volatile关键字的线程问题变得越来越流行。好好准备一下volatile变量如何确保并发环境中的可见性,排序和一致性。

  9. 什么是竞态条件(race condition)?您如何找到并解决竞态条件?
    Java中的另一个多线程问题主要出现在高级访谈中。大多数面试官询问您最近遇到的种族情况,如何解决,有时他们会编写示例代码并要求您检测竞态条件。有关更多信息,请参阅我的帖子-race condition in Java。在我看来,这是最好的Java线程面试问题之一,可以真正测试候选人在解决竞争条件或编写没有数据竞争或任何其他竞争条件的代码方面的经验。关于并发主题的最好的书是“Concurrency practices in Java(java并发实战)”。
  10. 你将如何在Java中进行线程转储?你将如何分析线程转储?

    在UNIX中,您可以使用kill -3,然后线程转储将在Windows上打印日志,您可以使用“CTRL + Break”。虽然这是一个相当简单的线程访谈问题,如果他们问你如何分析它会变得棘手。线程转储也可用于分析死锁情况。

  11. 我们调用start()方法时为什么要在start()方法里面调用run()方法, 为什么我们不直接调用run()方法?
    这是另一个经典的线程问题。最初,当我开始编写线程时,我有一些疑问。如今,我主要通过电话采访或中期和初级Java面试的第一轮面试问题进行询问。
    以下就是这个问题的答案。当你调用start()方法时,它会创建一个新线程并执行run()中声明的代码,同时直接调用run()方法。这不会创建任何新线程并在同一个调用线程上执行代码。关于更多信息,可以阅读这篇文章Difference Between Start and Run Method in Thread
    最常见的15个Java多线程,并发面试问题_第3张图片
  12. java中如何唤醒阻塞线程
    这是一个棘手的线程问题。阻塞可能由很多方面导致 - 如果线程在IO上被阻塞,那么,我认为没有办法打断线程。如果有的话,请告诉我。另一方面,如果由于调用wait(),sleep()或join()方法的结果而阻塞线程,则可以中断线程,并通过抛出InterruptedException来唤醒它。有关处理被阻塞线程的更多信息,请参阅我的帖子-How to Deal With Blocking Methods in Java。
  13. java中CyclicBarriar 和CountdownLatch区别(答案)

    新的Java线程面试问题主要是检查您对JDK 5并发包的熟悉程度。他们的一个区别是,一旦barrier被破坏,您可以重复使用CyclicBarrier,但不能重复使用CountDownLatch。如果您想了解更多信息,请查看Udemy的课程-Multithreading and Parallel Computing in Java。

  14. 什么是不可变对象?它如何帮助编写并发应用程序?
    虽然这个面试问题与线程没有直接关系,但它间接地帮助了很多。如果他们要求你写一个不可变的类或者问你为什么String在Java中是不可变的,那么这个面试问题会变得更加棘手。
  15. 您在多线程环境中遇到了哪些常见问题?你是怎么解决的?

    内存干扰,竞态条件,死锁,活锁和饥饿是多线程和并发编程带来的一些问题的一个例子。这些问题是无止境的;如果你弄错了,他们将难以检测和调试。

    这主要是关于Java的基于经验的面试问题。您可以看到Heinz Kabutz撰写的Java Concurrency in Practice Course,了解实际高性能多线程应用程序中遇到的一些实际问题。

这些是我最喜欢的Java线程面试问题和投资银行的常见问题。这个列表并不完整,所以请在下面评论一下你在面试中遇到的一些有趣的Java线程问题。本文收集并分享了关于多线程方面的精彩面试问题,这不仅有助于面试,而且为学习新的线程概念打开了大门。

其中一位重读Java的读者Hemant贡献了更多的java线程面试问题。以下是其他问题:

  1. Java中的绿色线程和本机线程之间的区别?
  2. 线程和进程之间的区别(答案)
  3. 什么是多线程中的上下文切换?
  4. 死锁和活锁,死锁和饥饿之间的区别?
  5. Java中使用了什么线程调度算法?
  6. 什么是java线程调度?
  7. 如何在线程中处理未处理的异常?
  8. 什么是线程组,为什么建议不要在Java中使用线程组?
  9. 为什么Executor框架比通过应用程序创建和管理线程更好?
  10. Java中Executor和Executors之间的区别?(答案)
  11. 如何在Windows和Linux服务器中找到哪个线程占用最大CPU?

你可能感兴趣的:(java)