Java 语言一个重要的特点就是内置了对并发的支持,让 Java 大受企业和程序员的欢迎。大多数待遇丰厚的 Java 开发职位都要求开发者精通多线程技术并且有丰富的 Java 程序开发、调试、优化经验,所以线程相关的问题在面试中经常会被提到。

在典型的 Java 面试中, 面试官会从线程的基本概念问起, 如:为什么你需要使用线程, 如何创建线程,用什么方式创建线程比较好(比如:继承 thread 类还是调用 Runnable 接口),然后逐渐问到并发问题像在 Java 并发编程的过程中遇到了什么挑战,Java 内存模型,JDK1.5 引入了哪些更高阶的并发工具,并发编程常用的设计模式,经典多线程问题如生产者消费者,哲学家就餐,读写器或者简单的有界缓冲区问题。仅仅知道线程的基本概念是远远不够的, 你必须知道如何处理死锁,竞态条件,内存冲突和线程安全等并发问题。掌握了这些技巧,你就可以轻松应对多线程和并发面试了。 许多 Java 程序员在面试前才会去看面试题,这很正常。因为收集面试题和练习很花时间,所以我从许多面试者那里收集了 Java 多线程和并发相关的 50 个热门问题。我只收集了比较新的面试题且没有提供全部答案。想必聪明的你对这些问题早就心中有数了, 如果遇到不懂的问题,你可以用 Google 找到答案。若你实在找不到答案,可以在文章的评论中向我求助。你也可以在这找到一些答案Java 线程问答 Top 12。 50 道 Java 线程面试题下面是 Java 线程相关的热门面试题,你可以用它来好好准备面试。 1) 什么是线程?线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速。比如,如果一个线程完成一个任务要 100 毫秒,那么用十个线程完成改任务只需 10 毫秒。Java 在语言层面对多线程提供了卓越的支持,它也是一个很好的卖点。欲了解更多详细信息请点击这里。 2) 线程和进程有什么区别?线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务。不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间。别把它和栈内存搞混,每个线程都拥有单独的栈内存用来存储本地数据。更多详细信息请点击这里。 3) 如何在 Java 中实现线程?在语言层面有两种方式。java.lang.Thread 类的实例就是一个线程但是它需要调用 java.lang.Runnable 接口来执行,由于线程类本身就是调用的 Runnable 接口所以你可以继承 java.lang.Thread 类或者直接调用 Runnable 接口来重写 run 方法实现线程。更多详细信息请点击这里. 4) 用 Runnable 还是 Thread?这个问题是上题的后续,大家都知道我们可以通过继承 Thread 类或者调用 Runnable 接口来实现线程,问题是,那个方法更好呢?什么情况下使用它?这个问题很容易回答,如果你知道 Java 不支持类的多重继承,但允许你调用多个接口。所以如果你要继承其他类,当然是调用 Runnable 接口好了。更多详细信息请点击这里。 6) Thread 类中的 start 和 run 方法有什么区别?这个问题经常被问到,但还是能从此区分出面试者对 Java 线程模型的理解程度。start 方法被用来启动新创建的线程,而且 start 内部调用了 run 方法,这和直接调用 run 方法的效果不一样。当你调用 run 方法的时候,只会是在原来的线程中调用,没有新的线程启动,start 方法才会启动新线程。更多讨论请点击这里7) Java 中 Runnable 和 Callable 有什么不同?Runnable 和 Callable 都代表那些要在不同的线程中执行的任务。Runnable 从 JDK1.0 开始就有了,Callable 是在 JDK1.5 增加的。 它们的主要区别是 Callable 的 call 方法可以返回值和抛出异常,而 Runnable 的 run 方法没有这些功能。Callable 可以返回装载有计算结果的 Future 对象。我的博客有更详细的说明。 8) Java 中 CyclicBarrier 和 CountDownLatch 有什么不同?CyclicBarrier 和 CountDownLatch 都可以用来让一组线程等待其它线程。与 CyclicBarrier 不同的是,CountdownLatch 不能重新使用。点此查看更多信息和示例代码。 9) Java 内存模型是什么?Java 内存模型规定和指引 Java 程序在不同的内存架构、CPU 和操作系统间有确定性地行为。它在多线程的情况下尤其重要。Java 内存模型对一个线程所做的变动能被其它线程可见提供了保证,它们之间是先行发生关系。这个关系定义了一些规则让程序员在并发编程时思路更清晰。比如,先行发生关系确保了:

  • 线程内的代码能够按先后顺序执行,这被称为程序次序规则。
  • 对于同一个锁,一个解锁操作一定要发生在时间上后发生的另一个锁定操作之前,也叫做管程锁定规则。
  • 前一个对Volatile的写操作在后一个volatile的读操作之前,也叫volatile变量规则。
  • 一个线程内的任何操作必需在这个线程的 start 调用之后,也叫作线程启动规则。
  • 一个线程的所有操作都会在线程终止之前,线程终止规则。
  • 一个对象的终结操作必需在这个对象构造完成之后,也叫对象终结规则。
  • 可传递性

我强烈建议大家阅读《Java 并发编程实践》第十六章来加深对 Java 内存模型的理解。 10) Java 中的 volatile 变量是什么?volatile 是一个特殊的修饰符,只有成员变量才能使用它。在 Java 并发程序缺少同步类的情况下,多线程对成员变量的操作对其它线程是透明的。volatile 变量可以保证下一个读取操作会在前一个写操作之后发生,就是上一题的 volatile 变量规则。点击这里查看更多 volatile 的相关内容。 11) 什么是线程安全?Vector 是一个线程安全类吗? (详见这里)如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。一个线程安全的计数器类的同一个实例对象在被多个线程使用的情况下也不会出现计算失误。很显然你可以将集合类分成两组,线程安全和非线程安全的。Vector 是用同步方法来实现线程安全的, 而和它相似的 ArrayList 不是线程安全的。 12) Java 中什么是竞态条件? 举个例子说明。竞态条件会导致程序在并发情况下出现一些 bugs。多线程对一些资源的竞争的时候就会产生竞态条件,如果首先要执行的程序竞争失败排到后面执行了,那么整个程序就会出现一些不确定的 bugs。这种 bugs 很难发现而且会重复出现,因为线程间的随机竞争。一个例子就是无序处理,详见答案。 13) Java 中如何停止一个线程?Java 提供了很丰富的 API 但没有为停止线程提供 API。JDK 1.0 本来有一些像 stop , suspend 和 resume 的控制方法但是由于潜在的死锁威胁因此在后续的 JDK 版本中他们被弃用了,之后 Java API 的设计者就没有提供一个兼容且线程安全的方法来停止一个线程。当 run 或者 call 方法执行完的时候线程会自动结束,如果要手动结束一个线程,你可以用 volatile布尔变量来退出 run 方法的循环或者是取消任务来中断线程。点击这里查看示例代码。 14) 一个线程运行时发生异常会怎样?这是我在一次面试中遇到的一个很刁钻的Java 面试题, 简单的说,如果异常没有被捕获该线程将会停止执行。 Thread.UncaughtExceptionHandler 是用于处理未捕获异常造成线程突然中断情况的一个内嵌接口。当一个未捕获异常将造成线程中断的时候 JVM 会使用Thread.getUncaughtExceptionHandler 来查询线程的 UncaughtExceptionHandler 并将线程和异常作为参数传递给 handler 的 uncaughtException 方法进行处理。

50个Java多线程面试题相关推荐

  1. 史上最全 Java 多线程面试题及答案

    这篇文章主要是对多线程的问题进行总结的,因此罗列了40个多线程的问题. 这些多线程的问题,有些来源于各大网站.有些来源于自己的思考.可能有些问题网上有.可能有些问题对应的答案也有.也可能有些各位网友也 ...

  2. Java多线程面试题总结(常见多线程面试题)

    不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎.大多数待遇丰厚的Java开发职位都要求开发者精通多线程 ...

  3. 2021年50道Java线程面试题

    2021年50道Java线程面试题 下面是Java线程相关的热门面试题,你可以用它来好好准备面试. 1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作 ...

  4. 15个顶级Java多线程面试题及回答(高级java工程师)

    Java 线程面试问题 在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分.如果你想获得任何股票投资银行的前台资讯职位,那么你应该准备很多关于多线程的问题.在投资银行业务中多线程和并发是 ...

  5. 15个顶级Java多线程面试题及答案

    转载自  15个顶级Java多线程面试题及答案 在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分.如果你想获得更多职位,那么你应该准备很多关于多线程的问题. 他们会问面试者很多令人混淆 ...

  6. 精选30道Java多线程面试题

    转载自 精选30道Java多线程面试题 1.线程和进程的区别 2.实现线程有哪几种方式? 3.线程有哪几种状态?它们之间如何流转的? 4.线程中的start()和run()方法有什么区别? 5.怎么终 ...

  7. 史上最全Java多线程面试题

    转载自 史上最全Java多线程面试题及答案 多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域.所以,学好多线程并发编程对Java程序员来来说极其重要的. 下面小编整理了60道最常见的 ...

  8. 15个Java多线程面试题

    2019独角兽企业重金招聘Python工程师标准>>> 在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分.如果你想获得任何股票投资银行的前台资讯职位,那么你应该准备很 ...

  9. 面试姊妹篇4:常见的Java多线程面试题

    主要内容 本文主要记录多线程相关的操作问题,这些问题主要出现在一些面试中,当然学会了对本身的代码能力也有提升. 目录 1.交替多线程 2.发令枪问题 3.多线程顺序执行 4.关于饥饿死锁 5.线程数设 ...

最新文章

  1. android listview 游标,Android Listview - 使用游标时无法选择多个项目
  2. Angular jasmine spied Method toHaveBeenCalled的执行原理
  3. Ixia推出首款太比特级网络安全测试平台
  4. LeetCode 912. 排序数组(10种排序)
  5. 递归(二)-------经典递归实例(汉诺塔问题)
  6. wordpress编辑插件_如何使用Tabify编辑屏幕插件减少WordPress帖子编辑器屏幕的拥挤
  7. nyoj8-一种排序
  8. 数据结构殷人昆电子版百度云资源_数据结构精讲与习题详解
  9. 内容协商 Spring ContentNegotiation
  10. shiro安全性框架
  11. 【一步教学,一步到位】拼多多社招三面多久给结果
  12. Excel常用函数(案例说明)
  13. javaweb——>个人博客项目
  14. C++中atof ,atoi函数用法
  15. 虚拟服务器 dmz区别,dmz主机和虚拟服务器区别(tp路由器虚拟服务器能干嘛)...
  16. SQL正则盲注-regexp
  17. 使用scrapy 爬取酷狗音乐歌手及歌曲名并存入mongodb中
  18. day17-远程管理SSH服务
  19. Fiddler抓包工具手机添加代理后连不上网解决办法
  20. 【观察】华为深入核心场景创新,推动智慧城轨迈入新时代

热门文章

  1. halcon算法库中各坐标系,位姿的解释及原理
  2. 人工智能换脸python_Python史诗级P图换脸小程序,AI换脸的简易版
  3. 西门子200SMART笔记
  4. 老毛桃 安装linux双系统,安装CentOS 7双系统(二)——安装过程step by step
  5. 计算机管理服务哪个是打印机的,开启打印机服务,教您win7开启打印机服务
  6. AVFoundation 学习资源列表
  7. 《红楼雷话》全文,很好很解气
  8. java读取pdf签名_Java 获取PDF中的数字签名信息
  9. 暴雪战网下载各个版本与修改默认登陆地点方法
  10. 【图像分割】基于形态学重建和过滤改进FCM算法(FRFCM)实现图像分割matlab代码