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

假设你有三个线程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,了解实际高性能多线程应用程序中遇到的一些实际问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值