最常见的15个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这篇帖子。

  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 。 
  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 
  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?

原文地址:https://www.cnblogs.com/lonske/p/12170723.html

时间: 2024-10-13 05:13:35

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

Java多线程并发09——如何实现线程间与线程内数据共享

本文将为各位带来 Java 阻塞队列相关只是.关注我的公众号「Java面典」了解更多 Java 相关知识点. 线程间数据共享 Java 里面进行多线程通信的主要方式就是共享内存的方式,共享内存主要的关注点有两个:可见性和有序性原子性.Java 内存模型(JMM)解决了可见性和有序性的问题,而锁解决了原子性的问题,理想情况下我们希望做到"同步"和"互斥".有以下常规实现方法: 将数据抽象成一个类 将数据抽象成一个类,并将对这个数据的操作作为这个类的方法,这么设计可以和

java 多线程并发问题总结

java 多线程并发主要通过关键字synchronized实现 Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行.另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块. 二.然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该ob

对JAVA多线程 并发编程的理解

对JAVA多线程并发编程的理解 Java多线程编程关注的焦点主要是对单一资源的并发访问,本文从Java如何实现支持并发访问的角度,浅析对并发编程的理解,也算是对前段时间所学的一个总结. 线程状态转换 Java语言定义了5中线程状态,在任何一个时间点,一个线程只能有且只有其中一种状态,这5中状态分别是: ?  新建(New):创建后尚未启动的线程处于这种状态 ?  运行(Runable):Runable包括了操作系统线程状态中的Running和Ready,也就是处于此状态的线程可能正在执行,也有可

Java多线程并发技术

Java多线程并发技术 参考文献: http://blog.csdn.net/aboy123/article/details/38307539 http://blog.csdn.net/ghsau/article/category/1707779 http://www.iteye.com/topic/366591 JAVA多线程实现方式主要有三种:继承Thread类.实现Runnable接口.使用ExecutorService.Callable.Future实现有返回结果的多线程.其中前两种方式

知识链-Java多线程并发

Java多线程并发 java并发容器(Map.List.BlockingQueue)

15个java多线程面试题及回答

1)现在有T1.T2.T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行? 这个线程问题通常会在第一轮或电话面试阶段被问到,目的是检测你对”join”方法是否熟悉.这个多线程问题比较简单,可以用join方法实现. 2)在Java中Lock接口比synchronized块的优势是什么? 你需要实现一个高效的缓存,它允许多个用户读,但只允许一个用户写,以此来保持它的完整性,你会怎样去实现它? lock接口在多线程和并发编程中最大的优势是它们为读和写分别提供了锁,它能满足你写像Co

Java 多线程并发编程面试笔录一览

知识体系图: 1.线程是什么? 线程是进程中独立运行的子任务. 2.创建线程的方式 方式一:将类声明为 Thread 的子类.该子类应重写 Thread 类的 run 方法 方式二:声明实现 Runnable 接口的类.该类然后实现 run 方法 推荐方式二,因为接口方式比继承方式更灵活,也减少程序间的耦合. 3.获取当前线程信息? Thread.currentThread() 4.线程的分类 线程分为守护线程.用户线程.线程初始化默认为用户线程. setDaemon(true) 将该线程标记为

java多线程并发概览

一.操作系统中线程和进程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程.比如在Windows系统中,一个运行的exe就是一个进程. 线程是指进程中的一个执行流程,一个进程中可以运行多个线程.比如java.exe进程中可以运行很多线程.线程总是属于某个进程,进程中的多个线程共享进程的内存. "同时"执行是人的感觉,在线程之间实际上轮换执行. 二.Java中的线程 在J

Java多线程并发基础面试题回答

Java多线程面试问题 1. 进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用.而线程是在进程中执行的一个任务.Java运行环境是一个包含了不同的类和程序的单一进程.线程可以被称为轻量级进程.线程需要较少的资源来创建和驻留在进程中,并且可以共享进程中的资源. 2. 多线程编程的好处是什么? 在多线程程序中,多个线程被并发的执行以提高程序的效率,CPU不会因为某个线程需要等待资源而进入空闲状态.多个线程共享堆内存(heap