在任何Java面试的过程当中, 多线程和并发方面的问题都是必不可少的一部分。如果你的梦想是进入任何一家股票投资银行去获得前台资讯方面的职位, 那么你应当准备许多关于多线程相关的题目。因为在投资银行业务的领域之内, 多线程和并发是一个备受推崇的话题。这一话题特别涉及到了电子交易的发展方向。
所以招聘方会向各位求职者提出大量容易令人感到困惑不解的Java线程方面的问题。面试官的目的其实只是想确认一下, 面试者是不是真的具备足够的关于Java线程以及并发方面的那些知识, 因为在这种情况下的候选人里面, 有许多人仅仅只是停留在比较表面的那种程度。
当前存在着T1这个线程, 同时也存在着T2这个线程, 还存在着T3这个线程, 那么我们应该通过什么样的方式来进行保证呢? 我们必须要来保证T2是在T1执行完毕之后才去执行的, 同时我们也必须要来保证T3是在T2执行完毕之后才去执行的。
这个有关线程的问题, 通常情况下, 会在第一轮面试当中, 或者是电话面试阶段被问到, 其目的, 主要就是为了检测你, 对于“join”这个方法的熟悉程度, 这个涉及多线程的问题, 其实本身是比较简单, 可以直接去借助“join”方法来实现。
Java语言里的Lock接口相比那种synchronized同步代码块, 它有哪些优势?
现在有人需要你去设计并实现一个高效的缓存系统, 这个系统允许很多用户同时进行读取操作, 可是写操作必须限制为只让一个用户执行, 这样做的目的是为了保证数据完整性, 你打算怎么去完成这项任务, 请你说明具体的实现方法。
lock这一接口, 它在多线程和并发编程里面最核心的好处, 是它为读取数据和写入数据这两种场景, 分别给出了对应的锁机制。这样你就能依靠它去写出像ConcurrentHashMap那样运行速度很快的高性能数据结构了, 同时也支持处理那些需要满足特定条件才能执行的阻塞逻辑。
目前为止, 关于Java线程方面的面试题, 已经变得越来越灵活了, 面试官会紧紧抓住你刚才说的话来进行追问。在我强烈建议你认真研读Locks资料这一前提下, 请务必明白在参与多线程相关岗位面试环节之前做好准备工作的重要性。
这是因为在当前的商业应用实践中,该类技术已经被大规模应用于构建电子商务交易系统的客户端缓存机制以及交易连接空间之中。
在java里面, wait方法和sleep方法是有不同的。
在电话面试的过程中, 候选人通常会被问到一些关于Java线程的问题, 在这些常见问题里, 存在一个显著的差异需要被注意, 即当线程处于等待状态时, wait方法会执行释放锁的动作, 与此同时, sleep方法则会一直保持对锁的持有而不将其释放出来, 鉴于这样的特性区别, wait方法一般适用于需要在多个线程之间进行交互协调的场景, 而sleep方法则更多被选用在仅仅为了实现暂停当前代码执行这一目的的情境中。
使用Java编程语言来实现一个阻塞队列。
这是一个在多线程面试场景下相对有挑战性的问题, 因为它具有多重考察目标。首先的一点是, 它能够检测出候选人是否具备使用Java线程代码进行实际编程操作的能力。其次的另一点是, 它可以考察候选人对并发业务场景的理解程度, 而且面试官你还能够基于这个问题追问提出非常多的问题。
如果该候选人选择使用wait方法以及notify方法来实现阻塞队列的功能的话, 那么你有权利进一步要求他调用Java 5版本里所提供的一系列新增的并发工具类再重新编写一次这个程序模块。
通过使用Java语言来编写相关的程序代码, 从而将生产者和消费者问题予以解决。
这和前面讲的那个问题有着非常密切的相似之处, 不过这个问题要算是更加经典的代表, 甚至在很多时候, 面试官都会专门把下面的这个问题拿出来进行提问。
当涉及到在Java环境下该如何去解决生产者以及消费者之间的问题时, 其实存在着非常多不同的实现思路与方法, 我此前已经具体分享过一个借助于阻塞队列来完成这一目标的实现方案。有些时候, 面试官们的追问还会更进一步, 直接询问应该如何去具体实现所谓哲学家进餐这一问题。
你打算用Java语言编写一个会引起死锁现象的程序代码, 并且你需要知道应当如何对这个问题进行修复或者处理。
这是我最喜欢的Java线程面试问题, 因为即使死锁问题在写多线程并发程序时非常普遍, 但是很多候选人并不能写出没有死锁的代码, 他们很挣扎。只要告诉他们, 你有N个资源和N个线程, 并且你需要所有的资源来完成一个操作。
为了保持表述简单, 在当前的语境里, 这里的数字n可以被替换成2, 这样做的目的是因为数据规模越大, 就会导致问题显得更加复杂一些。如果想要获取关于死锁现象的更多详细信息, 就需要去关注如何避免在Java编程环境中的死锁情况发生这一问题。
那么原子操作到底指的是个什么事呢, 而在java这个编程语言里面, 原子操作又具体是怎么样的一个情况。
这是一个非常简单的Java线程面试问题, 接下来的问题是问你需要怎么来同步一个原子操作。
请问在 Java 编程语言里, 关键字 Volatile 的核心功能到底是什么? 我们应该如何正确地使用它? 另外, 它在 Java 语言中与关键字 synchronized 存在哪些不一样的地方?
自从Java 5以及Java内存模型发生了改变之后, 基于volatile关键字的线程问题已经越来越普遍了。你应该要准备好回答问题, 也就是关于volatile变量是在怎样在并发环境当中确保可见性的, 顺序性是怎么确保的, 一致性又是怎么确保的。
究竟什么是竞争条件, 而你又是如何能够发现它, 并且进而解决这个所谓的竞争问题的。
这是一项属于多线程面试环节中偏向高阶阶段的测试题目。在很多情况下, 招聘方的面试官都会向你提出关于你近期所遭遇到的并发冲突现象究竟是什么, 以及你是依据何种策略来完成修复工作的这一问题内容。
还存在一种情形, 即在部分时间段里, 这些招聘人员会亲手编写一段具有基础逻辑的代码程序, 进而要求你从该段代码之中识别出其所存在的线程安全性隐患问题。在此方面, 你可以尝试去回顾我之前曾经发布过的那类有关Java语言中并发性问题的相关文章材料来进行学习和借鉴。
在我看来, 这是关于java线程面试问题之中最好的一种提问。这个问题能够非常确切地检测出候选人解决竞争条件的相关经验。此外还在于检测他是否书写出了毫无数据竞争风险或者其他任何形式的数据竞争风险的代码内容。
在涉及这方面内容的时候, 被认为是最为出色的那本著作, 便是《Concurrency Practices In Java》。

你将如何使用thread dump?你将如何分析Thread dump?
在UNIX系统里面, 你可以使用kill -3这种操作方式, 紧接着thread dump就会打印出日志信息, 而在Windows系统里面, 你可以使用“CTRL+Break”来进行操作。这是一个非常简单而且专业的线程面试问题, 但是如果对方问你应当怎样去进行分析的话, 那么情况就变得相当棘手了。
我们来深入探讨一下, 究竟是因为怎样的机制, 才致使我们在调用start方法的过程中, 会顺带地执行run方法的逻辑, 与此同时, 我们又需要去厘清的一个关键点是, 为什么在实际情况之下, 人们往往是不能够采取直接调用的方式来使用run方法的。
这是另一个非常经典的关于Java多线程的面试问题, 这也是我在刚开始撰写线程程序的时候所感到困惑的地方, 而现在这个问题通常会在电话面试期间或者是初中级Java招聘流程的第一轮面试环节中被提出, 对于这个问题的回答应当是如下情况, 即当开发人员调用start()方法之时, 系统便会创建出全新的线程对象, 并且去执行运行在run()方法内部的那些具体代码。
可是呢, 假如说你直接去调用 run 这个方法的话, 它不会去创建一个新的线程的, 同时它也不会去执行那个正在进行调用的线程里面的代码的。
你可以去读我先前所写的那篇题目为《start 与 run 方法的区别》的文章, 从而获取更加详细的信息内容的。
Java中你怎样唤醒一个阻塞的线程?
这是一个关于线程和阻塞的特别复杂的事情, 它有好多种解决办法。要是线程碰上了因为IO操作导致的阻塞情况, 我真心觉得没有办法能把这个线程给直接停止掉。
但是呢, 如果线程是因为调用了像wait这种办法、或者说sleep这种办法, 又或者是用到了join这种办法而陷入到暂停状态的, 那你就可以去打断这个线程, 并且通过让它抛出那个叫InterruptedException的异常来把它给弄醒。
之前我撰写的那篇被称作 How to deal with blocking methods in java 的文章之中, 包含了相当多的, 关于如何去处理线程阻塞的那些相关信息。
在Java程序开发领域里头, CycliBarriar还有CountdownLatch这两个东西它之间到底有什么区别是个挺多人想搞明白的事儿, 咱们今天就来把这个关系给捋一捋讲清楚。
这个线程问题主要用来检测你是否熟悉 JDK5 中的并发包。这两个的区别是 CyclicBarrier 可以重复使用已经通过的障碍, 而 CountdownLatch 不能重复使用。
什么是所谓的不可变对象, 这个概念具体指的是什么东西? 它对于我们去编写并发类型的应用程序能够带来哪一些实际性的协助?
还有一个在多线程环境下非常经典的面试试题, 虽然它并没有直接与线程技术本身挂钩, 但在实际应用中能够带来诸多间接性的益处。这项关于Java的应聘考核题目, 有可能变得极为棘手和困难, 尤其是在面试官明确要求你编写一个不可变动性质的对象实例, 或者问你为什么字符串类是被设计成不可变形态的时候。
你在多线程环境中遇到的共同的问题是什么?你是怎么解决它的?
在当前流行的多线程以及并发程序里, 大家经常遇到有内存可见性、竞争条件、死锁情况、饥饿状态或者活锁现象这些方面的问题。事实上此类问题是不会停歇的。
一旦你在编程时产生了差错, 想要找到错误以及进行调试工作会变得更加艰难不堪。这通常属于绝大多数偏向面试考核场景的内容, 而不是来自于真正的实际应用场景下的Java线程技术问题。
关于其余需要补充的几个相关问题。
1)在Java中, 绿色线程和本地线程之间的具体区别体现在哪里。
2)咱们来仔细看看线程和进程这两者之间的区别到底在哪儿。
3)什么是多线程中的上下文切换?
4)死锁与活锁的区别,死锁与馅饼的区别?
5)在Java这个编程语言的环境里面, 大家常常会问到, 那个被使用到的关于线程调度的算法到底是一个什么样的东西呢。
6)在Java语言里面, 到底是个怎么样的一种机制叫做线程调度呢。
7)在线程运行的时候, 你是怎么去应对那些没办法被抓住的异常的?
8)线程组到底指的是什么玩意? 为啥现在大家都说在Java编程里面, 不太提倡去使用它这个东西呢。
9)为什么采用Executor框架, 会要比在应用程序里亲自去创建、并且管理那些线程, 要来得好吧?
10)在Java编程语言里面, 很多人都会去弄明白Executor这个接口以及Executors这个类之间到底存在什么样的区别?
11)你应该去了解一下在Windows操作系统以及Linux操作系统的环境下, 到底应该如何进行查找, 来发现究竟是哪一个线程消耗了CPU时间而且那个CPU时间是其中最长的。
Copyright © 2018 All Rights Reserved 版权所有 宁国人才网 苏ICP备2024139598号-6
地址:安徽省合肥市瑶海区 EMAIL:
Powered by PHPYun.