关于java:华为18级大佬总结的15个顶级多线程面试题及答案

2次阅读

共计 3208 个字符,预计需要花费 9 分钟才能阅读完成。

在任何 Java 面试当中多线程和并发方面的问题都是必不可少的一部分。如果你想取得任何股票投资银行的前台资讯职位,那么你应该筹备很多对于多线程的问题。在投资银行业务中多线程和并发是一个十分受欢迎的话题,特地是电子交易倒退方面相干的。他们会问面试者很多令人混同的 Java 线程问题。面试官只是想确信面试者有足够的 Java 线程与并发方面的常识,因为候选人中有很多只浮于外表。用于间接面向市场交易的高容量和低延时的电子交易系统在实质上是并发的。上面这些是我在不同工夫不同地点喜爱问的 Java 线程问题。我没有提供答案,但只有可能我会给你线索,有些时候这些线索足够答复问题。当初援用 Java5 并发包对于并发工具和并发汇合的问题正在增多。那些问题中 ThreadLocal、Blocking Queue、Counting Semaphore 和 ConcurrentHashMap 比拟风行。

注:文末有福利,记得支付!

15 个 Java 多线程面试题及答复

1)当初有 T1、T2、T3 三个线程,你怎么保障 T2 在 T1 执行完后执行,T3 在 T2 执行完后执行?

这个线程问题通常会在第一轮或电话面试阶段被问到,目标是检测你对”join”办法是否相熟。这个多线程问题比较简单,能够用 join 办法实现。

2)在 Java 中 Lock 接口比 synchronized 块的劣势是什么?你须要实现一个高效的缓存,它容许多个用户读,但只容许一个用户写,以此来放弃它的完整性,你会怎么去实现它?

lock 接口在多线程和并发编程中最大的劣势是它们为读和写别离提供了锁,它能满足你写像 ConcurrentHashMap 这样的高性能数据结构和有条件的阻塞。Java 线程面试的问题越来越会依据面试者的答复来发问。我强烈建议在你去加入多线程的面试之前认真读一下 Locks,因为以后其大量用于构建电子交易终统的客户端缓存和交易连贯空间。

3)在 java 中 wait 和 sleep 办法的不同?

通常会在电话面试中常常被问到的 Java 线程面试问题。最大的不同是在期待时 wait 会开释锁,而 sleep 始终持有锁。Wait 通常被用于线程间交互,sleep 通常被用于暂停执行。

4)用 Java 实现阻塞队列。

这是一个绝对艰巨的多线程面试问题,它能达到很多的目标。第一,它能够检测侯选者是否能理论的用 Java 线程写程序;第二,能够检测侯选者对并发场景的了解,并且你能够依据这个问很多问题。如果他用 wait()和 notify()办法来实现阻塞队列,你能够要求他用最新的 Java 5 中的并发类来再写一次。

5)用 Java 写代码来解决生产者——消费者问题。

与下面的问题很相似,但这个问题更经典,有些时候面试都会问上面的问题。在 Java 中怎么解决生产者——消费者问题,当然有很多解决办法,我曾经分享了一种用阻塞队列实现的办法。有些时候他们甚至会问怎么实现哲学家进餐问题。

6)用 Java 编程一个会导致死锁的程序,你将怎么解决?

这是我最喜爱的 Java 线程面试问题,因为即便死锁问题在写多线程并发程序时十分广泛,然而很多侯选者并不能写 deadlock free code(无死锁代码?),他们很挣扎。只有通知他们,你有 N 个资源和 N 个线程,并且你须要所有的资源来实现一个操作。为了简略这里的 n 能够替换为 2,越大的数据会使问题看起来更简单。通过防止 Java 中的死锁来失去对于死锁的更多信息。

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

非常简单的 java 线程面试问题,接下来的问题是你须要同步一个原子操作。

8) Java 中的 volatile 要害是什么作用?怎么应用它?在 Java 中它跟 synchronized 办法有什么不同?

自从 Java 5 和 Java 内存模型扭转当前,基于 volatile 关键字的线程问题越来越风行。应该筹备好答复对于 volatile 变量怎么在并发环境中确保可见性、程序性和一致性。

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

这是一道呈现在多线程面试的高级阶段的问题。大多数的面试官会问最近你遇到的竞争条件,以及你是怎么解决的。有些工夫他们会写简略的代码,而后让你检测出代码的竞争条件。能够参考我之前公布的对于 Java 竞争条件的文章。在我看来这是最好的 java 线程面试问题之一,它能够确切的检测候选者解决竞争条件的教训,or writing code which is free of data race or any other race condition。对于这方面最好的书是《Concurrency practices in Java》。

10) 你将如何应用 thread dump?你将如何剖析 Thread dump?

在 UNIX 中你能够应用 kill -3,而后 thread dump 将会打印日志,在 windows 中你能够应用”CTRL+Break”。非常简单和业余的线程面试问题,然而如果他问你怎么剖析它,就会很辣手。

11) 为什么咱们调用 start()办法时会执行 run()办法,为什么咱们不能间接调用 run()办法?

这是另一个十分经典的 java 多线程面试问题。这也是我刚开始写线程程序时候的困惑。当初这个问题通常在电话面试或者是在初中级 Java 面试的第一轮被问到。这个问题的答复应该是这样的,当你调用 start()办法时你将创立新的线程,并且执行在 run()办法里的代码。然而如果你间接调用 run()办法,它不会创立新的线程也不会执行调用线程的代码。浏览我之前写的《start 与 run 办法的区别》这篇文章来取得更多信息。

12) Java 中你怎么唤醒一个阻塞的线程?

这是个对于线程和阻塞的辣手的问题,它有很多解决办法。如果线程遇到了 IO 阻塞,我并且不认为有一种办法能够停止线程。如果线程因为调用 wait()、sleep()、或者 join()办法而导致的阻塞,你能够中断线程,并且通过抛出 InterruptedException 来唤醒它。我之前写的《How to deal with blocking methods in java》有很多对于解决线程阻塞的信息。

13)在 Java 中 CycliBarriar 和 CountdownLatch 有什么区别?

这个线程问题次要用来检测你是否相熟 JDK5 中的并发包。这两个的区别是 CyclicBarrier 能够重复使用曾经通过的阻碍,而 CountdownLatch 不能重复使用。

14) 什么是不可变对象,它对写并发利用有什么帮忙?

另一个多线程经典面试问题,并不间接跟线程无关,但间接帮忙很多。这个 java 面试问题能够变的十分辣手,如果他要求你写一个不可变对象,或者问你为什么 String 是不可变的。

15) 你在多线程环境中遇到的独特的问题是什么?你是怎么解决它的?

多线程和并发程序中常遇到的有 Memory-interface、竞争条件、死锁、活锁和饥饿。问题是没有止境的,如果你弄错了,将很难发现和调试。这是大多数基于面试的,而不是基于理论利用的 Java 线程问题。

补充的其它几个问题:

  • 1)在 java 中绿色线程和本地线程区别?
  • 2)线程与过程的区别?
  • 3)什么是多线程中的上下文切换?
  • 4)死锁与活锁的区别,死锁与馅饼的区别?
  • 5)Java 中用到的线程调度算法是什么?
  • 6)在 Java 中什么是线程调度?
  • 7)在线程中你怎么解决不可捕获异样?
  • 8)什么是线程组,为什么在 Java 中不举荐应用?
  • 9)为什么应用 Executor 框架比应用利用创立和治理线程好?
  • 10)在 Java 中 Executor 和 Executors 的区别?
  • 11)如何在 Windows 和 Linux 上查找哪个线程应用的 CPU 工夫最长?

材料举荐

作为浏览福利,我整顿了一些多线程的相干材料(蕴含脑图、手写 PDF、面试真题等),当初收费分享给浏览到本篇文章的 Java 程序员敌人们,须要的可 【点击此处】 支付!上面为局部材料展现

视频材料

书籍材料

外围知识点

高频面试题

大厂面试真题

须要更多 Java 学习笔记 + 面试真题可【点击此处】获取!

正文完
 0