
多线程和并发问题已成为各种 Java 面试中必不可少的一部分。如果你准备参加投行的 Java 开发岗位面试,比如巴克莱银行(Barclays)、花旗银行(Citibank)、摩根史坦利投资公司(Morgan Stanley),你会遇到很多有关多线程的面试题多线程笔试题。多线程和并发是投行面试的热门知识点,尤其是在面试有关电子交易开发工作时,他们喜欢用棘手的 Java 线程面试题轰炸面试者。他们希望确保面试者对 Java 多线程和并发有扎实的知识基础,因为他们大多数关注高性能带来的竞争优势。
举个例子,直接市场准入模式(Direct to Market,DMA)使用高容量低延迟的电子交易系统,通常来说是并发的。大多数时间他们致力于微秒级的延迟,所以掌握如何有效地降低延迟、提高吞吐量非常重要。
有一些 Java 线程面试题是我特别中意的。我并不会直接给你答案,而是尽可能给你指点。我会之后补充上详细答案,正如我在其他文章中那样。
这是另外一个容易遵循且受益巨大的最佳实践,并发集合比同步集合的可扩展性更好,所以在并发编程时使用并发集合效果更好。多用并发集合少用同步集合这是另外一个容易遵循且受益巨大的最佳实践,并发集合比同步集合的可扩展性更好,所以在并发编程时使用并发集合效果更好。如果在读多写少这种对并发集合有利的条件下使用并发集合,这会比使用同步集合更具有可伸缩性。
//线程池所使用的缓冲队列. //线程池维护线程的最少数量. //线程池维护线程的最大数量. //线程池维护线程所允许的空闲时间. . . . .。步骤二中曝气头9工作时,由于气提作用,会使水流由下向上升流,形成竖直流, 水平流在流经格网7时,由于断面的减小其流速突然增大,而在刚刚流过格网7后其流速又 骤然减小,此流速差可以在水体中产生出众多的诱导涡旋,诱导涡旋在水体中不断交汇又 形成更多、更小的涡旋,从而在整个池体中形成无数的微涡流,涡流生化池6内的悬浮活性 污泥(菌胶团)、悬浮气泡、溶解氧及有机污染物在竖直流、水平流及微涡流三种水流的共 同作用下,处于高度悬浮和混合状态,并均勻地分布在涡流生化池6的横断面上,避免了普 通推流池中易出现的短流现象,提高了池体的空间利用率。线程运行时,内存中会建立一个线程池,冻结状态的线程都存在于线程池中,notify()执行时唤醒的也是线程池中的线程,线程池中有多个线程时唤醒第一个被冻结的线程。
15 个 Java 线程面试题和答案
在典型的 java 面试中, 面试官会从线程的基本概念问起, 如:为什么你需要使用线程, 如何创建线程,用什么方式创建线程比较好(比如:继承 thread 类还是调用 runnable 接口),然后逐渐问到并发问题像在 java 并发编程的过程中遇到了什么挑战,java 内存模型,jdk1.5 引入了哪些更高阶的并发工具,并发编程常用的 设计模式,经典多线程问题如生产者消费者,哲学家就餐,读写器或者简单的有界缓冲区问题。通常,使用java来开发一个简单的并发应用程序时,会创建一些runnable对象,然后创建对应的thread 对象来控制程序中这些线程的创建、执行以及线程的状态。基于actor编程模型来开发并发计算程序相对于原来基于java线程方式来开发,关键的不同在哪里,为啥说actor是更轻量化的并发处理模型。
有t1,t2,t3三个线程,怎么确保它们按顺序执行。比如有t1,t2两个线程,t1会通过t2的base来获得t2的最后一个任务(当然实际上是通过一个随机数r来取得某个线程最后一个任务),t1也会通过自己的top来执行自己的第一个任务。某一时刻临界区内至多只有一个线程在执行,如果已有线程t1在执行,要进入临界区的其它线程t2在执行lock()之后就会被挂起等待。
这个线程面试题通常在第一轮面试或电话面试时被问到,这道多线程问题为了测试面试者是否熟悉 join 方法的概念。答案也非常简单——可以用 Thread 类的 join 方法实现这一效果。
nsuserdefaults 提供了一个与默认设置交互的接口. 这些默认设置允许一个 app 为每一个单独的用户的设置提供定制化的行为. 数据的同步 我们可以通过 nsuserdefaults 对象在运行时从读取用户的数据, 并添加到缓存中. 在我们正常获取或者设置 nsuserdefaults 的值时, 和缓存中的数据其实并没有同步更新, 因为这样...。我们希望进程在读取数据的时候,能有最高的性能,最好能和在堆内存中读写类似,又希望这些缓存数据,能被放在多个进程内,以分布式的形态提供高吞吐的服务,其中最关键的问题,就是缓存数据的同步。闪迪x300的并发随机读取性能表现不错,写入性能则是受到了tlc闪存的写入性能影响。

多线程和并发编程中使用 lock 接口的最大优势是它为读和写提供两个单独的锁,可以让你构建高性能数据结构,比如 ConcurrentHashMap 和条件阻塞。
这道 Java 线程面试题越来越多见,而且随后的面试题都基于面试者对这道题的回答多线程笔试题。
我强烈建议在任何 Java 多线程面试前都要多看看有关锁的知识,因为如今电子交易系统的客户端和数据交互中,锁被频繁使用来构建缓存。
3. Java 中 wait 和 sleep 方法有什么区别?
其中wait表示让正在进行的线程暂停执行,释放对象锁,进入等待阻塞状态,直到被其他的线程唤醒或者是等待阻塞超时才重新进入就绪状态等待获取锁,。wait()方法用于线程间通信,如果等待条件为真且其它线程被唤醒时它会释放锁,而sleep()方法仅仅释放cpu资源或者让当前线程停止执行一段时间,但不会释放锁。wait ()方法用于线程间通信,如果等待条件为真且其它线程被唤醒时它会释放锁,而 sleep ()方法仅仅释放 cpu 资源或者让当前线程停止执行一段时间,但不会释放锁。

4. 如何在 Java 中实现一个阻塞队列?
这是一道相对困难的 Java 多线程面试题,考察点很多。它考察了面试者是否真正写过 Java 多线程代码,考察了面试者对并发场景的理解。并且可以根据面试者的代码问很多后续问题,如果他用 wait() 和 notify() 方法成功实现了阻塞队列,可以让他用 Java 5 的并发类重新实现一次。
5. 如何在 Java 中编写代码解决生产者消费者问题?
他说,大数据并不是对所有的一切都有用,从基本的哲学来说,从来不给人类一个解决一切的方案,因为如果有这么一个解决一切的方案,“通过全运会搭建的平台,我们能够发现更多的人才。建议你最好列出问题并自行拟定解决问题的方案,拿着这些东西向有关专家请教,但是不要提空洞的无法给你实际帮忙的问题,如果你已经开业了,遇到了困难也可以带着问题发生的原因,问题本身以及自己设计的解决问题的方案到专家门诊室寻求帮忙。异步回调方案 典型如nodejs,遇到阻塞的情况,比如网络调用,则注册一个回调方法(其实还包括了一些上下文数据对象)给io调度器(linux下是libev,调度器在另外的线程里),当前线程就被释放了,去干别的事情了。

6. 写一段死锁代码。你在 Java 中如何解决死锁?
这是我最喜欢的 Java 多线程面试题,因为即使死锁在多线程并发编程中十分常见,许多面试者仍然抓耳挠腮,不能写出无死锁的代码。
只需要问他们如果有 N 个资源和 N 个线程去执行某个操作,然后请求所有资源。
这里的 N 可以是 2 作为最简单的情况,也可以是个很大的数字让问题变复杂。有关死锁的更多信息可以看这篇文章Java 中如何避免死锁。

7. 什么是原子操作?Java 中有哪些原子操作?
由2.1可知,要编写正确的并发程序,关键问题在于:在访问共享的可变状态时需要进行正确的管理,这里正确的管理主要解决竞态条件和数据竞争(主要包括对象可见性)问题,我们知道同步方法和同步代码可以确保以原子的方式执行操作,因此错误的会认为synchronized只能用于实现原子性和确定临界区(critical section)即解决竞态条件问题,其实同步还有重要的一方面就是内存(对象)的可见性(visibly)。2000等操作系统下,使用的vc、vb、java或c等编程语言,采用进程(线程)同步和互斥的技术编写程序实现生产者消费者问题或哲学家进餐问题或读者-写者问题或自己设计一个简单进程(线程)同步和互斥的实际问题。虽然线程的同步可以保证每个线程在执行时的“原子性”,但如何保证线程a已经写入的而且还没来得及被输出的数据会由于同一个线程a的再次执行而不被覆盖呢(同一个线程a之所以会再次执行,可能是因为此时线程a的时间片还没有用完)。
8. Java 中 volatile 关键字是什么?你如何使用它?它和 Java 中的同步方法有什么区别?
有一种普遍的方法是通过一个全局的线程安全的map来存储各个线程的变量副本,但是这种做法已经完全违背了threadlocal的本意,设计threadlocal的初衷就是为了避免多个线程去并发访问同一个对象,尽管它是线程安全的。加入gil主要的原因是为了降低程序的开发的复杂度,比如现在的你写python不需要关心内存回收的问题,因为python解释器帮你自动定期进行内存回收,你可以理解为python解释器里有一个独立的线程,每过一段时间它起wake up做一次全局轮询看看哪些内存数据是可以被清空的,此时你自己的程序 里的线程和 py解释器自己的线程是并发运行的,假设你的线程删除了一个变量,py解释器的垃圾回收线程在清空这个变量的过程中的clearing时刻,可能一个其它线程正好又重新给这个还没来及得清空的内存空间赋值了,结果就有可能新赋值的数据被删除了,为了解决类似的问题,python解释器简单粗暴的加了锁,即当一个线程运行时,其它人都不能动,这样就解决了上述的问题,这可以说是python早期版本的遗留问题。高并发:vert.x有一个简单的异步编程模型(actor模型),非常适用于非阻塞的应用程序,它可以用最小数量的操作系统线程来达到10s、100s甚至百万级别的并发连接(vert.x内置了和操作系统内核数量相等的线程数来处理verticles,这样你就可以不必使用更多的线程就可以实现一个完美的非阻塞应用)。
9. 什么是竞态条件?你如何发现并解决竞态条件?

我们可以发现这种方法比我们之前的synchronized同步方法或者是单监视器的锁对象都来得高效和方便些,之前都是使用notifyall()和signalall()方法去唤醒池中的线程,然后让池中的线程又进入 竞争队列去抢占cpu资源,这样不仅唤醒了无关的线程而且又让全部线程进入了竞争队列中,而我们最后使用两种器分别生产者线程和消费者线程,这样的方式恰好解决前面两种方式的问题所在,我们每次唤醒都只是生产者线程或者是消费者线程而不会让两者同时唤醒,这样不就能更高效得去执行程序了吗。1、 代码通过面向对象的设计思路,将系统分为mario,物品,敌人,背景,窗体显示等多个java类,共1600多行代码,运用了java的swing、io操作、线程、类集等技术,并完全按照java编码规范进行命名和编写。执行以上的代码,我们会发现,得到的结果是混乱的,出现上述的最主要的原因是,我们在编写多线程代码的过程中,每一个线程都尝试去写同一个文件,这样便出现了上述的问题,这便是共享资源的同步问题,在linux编程中,线程同步的处理方法包括:信号量,互斥锁和条件变量。
10. 在 Java 中你如何转储线程(thread dump)?如何分析它?
在 UNIX 中,你可以使用 kill -3 然后线程转储日志会打印在屏幕上,可以使用 CTRL+Break 查看。这只是一个较简单的线程面试题,狡猾一点的话他们会问你如何分析转储日志。线程转储日志对于分析死锁情况非常有用。
p1.start() #start会自动调用run。用start(),start()会通过调用run()来实现多进程。思考:线程对象调用 run方法和调用start方法区别。
这是一个基本的 Java 多线程面试题。最初,我刚开始多线程编程时对此还有些困惑。如今我一般在 Java 中级面试的电话面试或一轮面试中遇到。
这道问题的答案是这样的。当你调用 start() 方法时,它会新建一个线程然后执行 run() 方法中的代码。如果直接调用 run() 方法,并不会创建新线程,方法中的代码会在当前调用者的线程中执行。可以看这篇文章了解更多线程中 Start 和 Run 方法的区别。

12. Java 中你如何唤醒阻塞线程?
这是有关线程的一个很狡猾的问题。有很多原因会导致阻塞,如果是 IO 阻塞,我认为没有方式可以中断线程(如果有的话请告诉我)。另一方面,如果线程阻塞是由于调用了 wait(),sleep() 或 join() 方法,你可以中断线程,通过抛出 InterruptedException 异常来唤醒该线程。可以看这篇文章了解有关处理阻塞线程的知识Java 中如何处理阻塞方法。
13. Java 中 CyclicBarriar 和 CountdownLatch 有什么区别?
重复精度是指如果动作重复次数多机械手到达同样位置的精确程度。重复精度:重复精度是指如果动作重复多次,机器人到达同样位置的精确程度。重复精度是指如果动作重复多次,机械手到达同样位置的精确程度。
14. 什么是不可变类?它对于编写并发应用有何帮助?
尽管这道面试题和线程没有直接关系,但间接影响也很大。如果面试官随后让你写一个不可变类,或问你为什么 Java 中的 String 是不可变的,会让面试题变得更加复杂。
15. 你在多线程环境中遇到的最多的问题是什么?你如何解决的?
内存干扰、竞态条件、死锁、活锁、线程饥饿是多线程和并发编程中比较有代表性的问题。这类问题无休无止,而且难于定位和调试。
这是基于经验给出的 Java 面试题。
从2012至2016年的真题来看,外交部的面试形式均为半结构化面试,在题目数量和问题设置方有明显的特点,一般为7道题左右,每人被提问的问题数量受答题情况和考官对考生的关注程度影响。不同于其他高中100多名考生同答一份题,今年2中的自招面试题与往年的直升生面试一样,采用了多套题目、学生抽签加自由选择的方式进行。1、进入考场前:提前到达考场,核对信息,进入候考室,等待抽题,抽题的顺序是根据面试所安排的序号所进行的,考生所抽的题目是待会面试进行试讲的题目,幼儿园学段面试有两道题,考生从中抽选一题作为待会试讲的题目,两道题一般是涉及两种不同的类型(弹唱、绘画、手工制作、体育活动、科学活动等),我当时所抽的题一题是弹唱类、一题是绘画类,我个人觉得弹唱类比较难,所以就选择了绘画类,但是有时也有人抽的两道都是弹唱类的,所以小伙伴们在平常准备的时候每一类型都要多加准备,这样在面试的时候才不会手足无措。
有位读者提供了一些 Java 线程面试题。补充在下面:
【关于投稿】
如果大家有原创好文投稿,请直接给公号发送留言。
声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/ruanjian/article-102175-1.html
地球动荡的根源国太源歇斯底里了
辛苦了