热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

假设你有三个线程T1,T2,T3。你如何能保证线程T2在线程T1后运行,T3在T2后运行这个线程面试问题大多是在第一轮或电话筛选轮次中会被问到的,这个多

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

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

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

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

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

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

Java多线程中sleep和wait方法的区别

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

abeb4f24eebdb64d756bb7deb1c10467.gif

如何在Java中实现阻塞队列?

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

在Java中如何解决生产者消费者问题? (solution)

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

编写一个会导致死锁的程序。你将如何解决Java中的死锁问题?

这是我最感兴趣的java面试问题,因为,尽管在编写多线程并发程序时死锁很常见,但许多候选人都无法编写无死锁代码,而且他们很挣扎。

只要询问他们是否有N个资源和N个线程来完成操作;那么,你需要所有的资源。

用N来替换最简单的情况和更高的数字这两种情况,以使问题更加令人生畏。有关死锁的更多信息,请参见How to avoid deadlock in Java 。

abc471b6da7f90b06dcc55ce45dd9561.png

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

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

什么是Java中的volatile关键字?你如何使用它?它与Java中的synchronized方法有什么不同?

在对Java 5和Java内存模型进行更改之后,基于Java中的volatile关键字的线程问题变得越来越流行。好好准备一下volatile变量如何确保并发环境中的可见性,排序和一致性。

什么是竞态条件(race condition)?您如何找到并解决竞态条件?

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

你将如何在Java中进行线程转储?你将如何分析线程转储?

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

我们调用start()方法时为什么要在start()方法里面调用run()方法, 为什么我们不直接调用run()方法?

这是另一个经典的线程问题。最初,当我开始编写线程时,我有一些疑问。如今,我主要通过电话采访或中期和初级Java面试的第一轮面试问题进行询问。

以下就是这个问题的答案。当你调用start()方法时,它会创建一个新线程并执行run()中声明的代码,同时直接调用run()方法。这不会创建任何新线程并在同一个调用线程上执行代码。关于更多信息,可以阅读这篇文章Difference Between Start and Run Method in Thread

b903021ad049744a484bc2e260eb13fc.png

java中如何唤醒阻塞线程

这是一个棘手的线程问题。阻塞可能由很多方面导致 - 如果线程在IO上被阻塞,那么,我认为没有办法打断线程。如果有的话,请告诉我。另一方面,如果由于调用wait(),sleep()或join()方法的结果而阻塞线程,则可以中断线程,并通过抛出InterruptedException来唤醒它。有关处理被阻塞线程的更多信息,请参阅我的帖子-How to Deal With Blocking Methods in Java。

java中CyclicBarriar 和CountdownLatch区别(答案)

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

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

虽然这个面试问题与线程没有直接关系,但它间接地帮助了很多。如果他们要求你写一个不可变的类或者问你为什么String在Java中是不可变的,那么这个面试问题会变得更加棘手。

您在多线程环境中遇到了哪些常见问题?你是怎么解决的?

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

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



推荐阅读
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • 如何用JNI技术调用Java接口以及提高Java性能的详解
    本文介绍了如何使用JNI技术调用Java接口,并详细解析了如何通过JNI技术提高Java的性能。同时还讨论了JNI调用Java的private方法、Java开发中使用JNI技术的情况以及使用Java的JNI技术调用C++时的运行效率问题。文章还介绍了JNIEnv类型的使用方法,包括创建Java对象、调用Java对象的方法、获取Java对象的属性等操作。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • Java程序设计第4周学习总结及注释应用的开发笔记
    本文由编程笔记#小编为大家整理,主要介绍了201521123087《Java程序设计》第4周学习总结相关的知识,包括注释的应用和使用类的注释与方法的注释进行注释的方法,并在Eclipse中查看。摘要内容大约为150字,提供了一定的参考价值。 ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
  • 使用eclipse创建一个Java项目的步骤
    本文介绍了使用eclipse创建一个Java项目的步骤,包括启动eclipse、选择New Project命令、在对话框中输入项目名称等。同时还介绍了Java Settings对话框中的一些选项,以及如何修改Java程序的输出目录。 ... [详细]
author-avatar
1471446448_9c38cc
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有