天下无难试之多线程面试刁难大全

多线程技术在互联网技术方面使用如此广泛,几乎所有的后端技术面试官都要在并发编程的使用和原理方面对小伙伴们进行各种刁难。作为一名在互联网技术行业打击过成百上千名【请允许我夸张一下】的资深技术面试官,看过了无数落寞的身影失望的离开,略感愧疚,故献上此文,希望各位读者以后面试势如破竹,永无失败!

什么是线程?

线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位,可以使用多线程对进行运算提速。

比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成改任务只需10毫秒

什么是多线程?优缺点?

什么是多线程?

多线程:是指从软件或者硬件上实现多个线程的并发技术。

多线程的好处:

1.使用多线程可以把程序中占据时间长的任务放到后台去处理,如图片、视屏的下载

2.发挥多核处理器的优势,并发执行让系统运行的更快、更流畅,用户体验更好

多线程的缺点:

1.大量的线程降低代码的可读性;

2.更多的线程需要更多的内存空间

3.当多个线程对同一个资源出现争夺时候要注意线程安全的问题。

线程的五个状态(五种状态,创建、就绪、运行、阻塞和死亡)?

线程通常都有五种状态,创建、就绪、运行、阻塞和死亡。

第一是创建状态。在生成线程对象,并没有调用该对象的start方法,这是线程处于创建状态。

第二是就绪状态。当调用了线程对象的start方法之后,该线程就进入了就绪状态,但是此时线程调度程序还没有把该线程设置为当前线程,此时处于就绪状态。在线程运行之后,从等待或者睡眠中回来之后,也会处于就绪状态。

第三是运行状态。线程调度程序将处于就绪状态的线程设置为当前线程,此时线程就进入了运行状态,开始运行run函数当中的代码。

第四是阻塞状态。线程正在运行的时候,被暂停,通常是为了等待某个时间的发生(比如说某项资源就绪)之后再继续运行。sleep,suspend,wait等方法都可以导致线程阻塞。

第五是死亡状态。如果一个线程的run方法执行结束或者调用stop方法后,该线程就会死亡。对于已经死亡的线程,无法再使用start方法令其进入就绪

什么是CAS?

CAS(compare and swap)的缩写,中文翻译成比较并交换。

CAS 不通过JVM,直接利用java本地方 JNI(Java Native Interface为JAVA本地调用),直接调用CPU 的cmpxchg(是汇编指令)指令。

利用CPU的CAS指令,同时借助JNI来完成Java的非阻塞算法,实现原子操作。其它原子操作都是利用类似的特性完成的。

整个java.util.concurrent都是建立在CAS之上的,因此对于synchronized阻塞算法,J.U.C在性能上有了很大的提升。

CAS是项乐观锁技术,当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败,失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次尝试。

CAS应用

CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。

CAS优点

确保对内存的读-改-写操作都是原子操作执行

CAS缺点

CAS虽然很高效的解决原子操作,但是CAS仍然存在三大问题。ABA问题,循环时间长开销大和只能保证一个共享变量的原子操作

什么是AQS?

AbstractQueuedSynchronizer简称AQS,是一个用于构建锁和同步容器的框架。事实上concurrent包内许多类都是基于AQS构建,例如ReentrantLock,Semaphore,CountDownLatch,ReentrantReadWriteLock,FutureTask等。AQS解决了在实现同步容器时设计的大量细节问题。

AQS使用一个FIFO的队列表示排队等待锁的线程,队列头节点称作“哨兵节点”或者“哑节点”,它不与任何线程关联。其他的节点与等待线程关联,每个节点维护一个等待状态waitStatus。

什么是乐观锁和悲观锁?

悲观锁

Java在JDK1.5之前都是靠synchronized关键字保证同步的,这种通过使用一致的锁定协议来协调对共享状态的访问,可以确保无论哪个线程持有共享变量的锁,都采用独占的方式来访问这些变量。独占锁其实就是一种悲观锁,所以可以说synchronized是悲观锁。

乐观锁

乐观锁( Optimistic Locking)其实是一种思想。相对悲观锁而言,乐观锁假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让返回用户错误的信息,让用户决定如何去做。

并发编程(concurrency)并行编程(parallellism)有什么区别?

并发(concurrency)和并行(parallellism)是:

解释一:并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。

解释二:并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。

解释三:在一台处理器上“同时”处理多个任务,在多台处理器上同时处理多个任务。如hadoop分布式集群

所以并发编程的目标是充分的利用处理器的每一个核,以达到最高的处理性能。

想要了解更多多线程知识点的,可以加群650385180,多线程的学习资料以及多线程面试题汇总都在群的共享区供大家免费下载.

怎么唤醒一个阻塞的线程?

如果线程是因为调用了wait()、sleep()或者join()方法而导致的阻塞,可以中断线程,并且通过抛出InterruptedException来唤醒它;如果线程遇到了IO阻塞,无能为力,因为IO是操作系统实现的,Java代码并没有办法直接接触到操作系统。

如何检测死锁?怎么预防死锁?

所谓死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁

通俗地讲就是两个或多个进程被无限期地阻塞、相互等待的一种状态

死锁产生的原因?

1.因竞争资源发生死锁 现象:系统中供多个进程共享的资源的数目不足以满足全部进程的需要时,就会引起对诸资源的竞争而发生死锁现象

2.进程推进顺序不当发生死锁

死锁的四个必要条件:

互斥条件:进程对所分配到的资源不允许其他进程进行访问,若其他进程访问该资源,只能等待,直至占有该资源的进程使用完成后释放该资源

请求和保持条件:进程获得一定的资源之后,又对其他资源发出请求,但是该资源可能被其他进程占有,此事请求阻塞,但又对自己获得的资源保持不放

不可剥夺条件:是指进程已获得的资源,在未完成使用之前,不可被剥夺,只能在使用完后自己释放

环路等待条件:是指进程发生死锁后,若干进程之间形成一种头尾相接的循环等待资源关系

这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之

一不满足,就不会发生死锁。

检测死锁

有两个容器,一个用于保存线程正在请求的锁,一个用于保存线程已经持有的锁。每次加锁之前都会做如下检测:

检测当前正在请求的锁是否已经被其它线程持有,如果有,则把那些线程找出来

遍历第一步中返回的线程,检查自己持有的锁是否正被其中任何一个线程请求,如果第二步返回真,表示出现了死锁

死锁的解除与预防:

理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、预防和

解除死锁。

所以,在系统设计、进程调度等方面注意如何不让这四个必要条件成立,如何确

定资源的合理分配算法,避免进程永久占据系统资源。

此外,也要防止进程在处于等待状态的情况下占用资源。因此,对资源的分配要给予合理的规划。

想要了解更多多线程知识点的,可以加群650385180,多线程的学习资料以及多线程面试题汇总都在群的共享区供大家免费下载.

更多多线程面试题

1.什么是原子操作?在Java Concurrency API中有哪些原子类(atomic classes)?

2.什么是Executors框架?

3.什么是阻塞队列?如何使用阻塞队列来实现生产者-消费者模型?

4.什么是Callable和Future?

5.什么是FutureTask?

6.什么是同步容器和并发容器的实现?

7.什么是多线程的上下文切换?

8.ThreadLocal的设计理念与作用?

9. ThreadPool(线程池)用法与优势?

10.加群:650385180获取更多多线程知识点及面试题

11. Concurrent包里的其他东西:ArrayBlockingQueue、CountDownLatch等等。

12. synchronized和ReentrantLock的区别?

13. Semaphore有什么作用?

14. Java Concurrency API中的Lock接口(Lock interface)是什么?对比同步它有什么优势?

总结

关于Java多线程面试技术点的一些总结已经写完了,受限于我的视野,所以可能写的不是很全面,大家要是有不同意见的,可以分享出来,一起交流,要是想深入了解多线程技术知识点的,可以加上面的群,希望可以帮助在这个行业发展的朋友和童鞋们,在论坛博客等地方少花些时间找资料,把有限的时间,真正花在学习上。

原文地址:http://blog.51cto.com/13676067/2105547

时间: 2024-08-29 15:16:26

天下无难试之多线程面试刁难大全的相关文章

redis面试刁难大全

Redis有哪些数据结构? 字符串String.字典Hash.列表List.集合Set.有序集合SortedSet. 如果你是Redis中高级用户,还需要加上下面几种数据结构HyperLogLog.Geo.Pub/Sub. 如果你说还玩过Redis Module,像BloomFilter,RedisSearch,Redis-ML,面试官得眼睛就开始发亮了. 使用过Redis分布式锁么,它是什么回事? 先拿setnx来争抢锁,抢到之后,再用expire给锁加一个过期时间防止锁忘记了释放. 这时候对

Java多线程面试15道

Java 线程面试问题 在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分.如果你想获得任何股票投资银行的前台资讯职位,那么你应该准备很多关于多线程的问题.在投资银行业务中多线程和并发是一个非常受欢迎的话题,特别是电子交易发展方面相关的.他们会问面试者很多令人混淆的Java线程问题.面试官只是想确信面试者有足够的Java线程与并发方面的知识,因为候选人中有很多只浮于表面.用于直接面向市场交易的高容量和低延时的电子交易系统在本质上是并发的.下面这些是我在不同时间不同地点喜欢问的Jav

程序员Java架构师多线程面试最精彩的回答

当我们在Java架构师面试的过程中常见的多线程和并发方面的问题肯定是必不可少的一部分.那么在面试之前我们更应该多准备一些关于多线程方面的问题.面试官只是想确信面试者有足够的Java线程与并发方面的知识,因为有很多只停留于表面的理论知识,归根结底还是功力不够扎实.下面这些是我在不同时间不同地点喜欢问的Java线程问题,供大家参考. 15个Java架构师多线程面试题及回答解析1)你将如何使用threaddump?你将如何分析Threaddump? 在UNIX中你可以使用kill-3,然后thread

Java多线程面试问题

原文链接:http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-answers/ 多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一.在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢固的掌握Java多线程基础知识来对应日后碰到的问题. Java多线程面试问题 1. 进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者

H3 BPM10.0让天下没有难用的流程之产品概述

一.产品简介 BPM(Business Process Management),是指根据业务环境的变化,推进人与人之间.人与系统之间以及系统与系统之间的整合及调整的经营方法与解决方案的IT工具. H3 BPM,即H3 业务流程管理,基于"流程再造之父"迈克尔.哈默的管理思想,以流程作为企业管理的切入点,帮助企业实现各业务环节高度整合.端到端的流程管理.通过流程设计.运行.监控.分析.优化等流程全生命周期的闭环管理,迅速降低企业的运营成本.提升运营效率.减少运营风险,并实现企业管理的持续

transformjs:让天下没有难做的生意!不对,是特效!

http://www.cnblogs.com/iamzhanglei/p/3990132.html transformjs:让天下没有难做的生意!不对,是特效! 2014-09-24 10:51 by [当耐特], 3465 阅读, 6 评论, 收藏, 编辑 写在前面 transform是css3新增的一个属性,可是令开发者费解的是,其内部又有大量的属性如旋转.缩放.扭曲.平移,这也就导致了获取或者是设置transform中一个或者多个属性变得异常麻烦. transform.js意义 让前端没有

云栖大会SaaS加速器专场 | 阿里云资深技术专家黄省江:让天下没有难做的SaaS

导语:本文中,阿里云资深技术专家黄省江(花名禅笑)将聚焦“SaaS加速器——让天下没有难做的SaaS”,对伙伴来说,SaaS加速器帮助他们做好SaaS,卖好SaaS:对企业来说,SaaS加速器帮助他们选好SaaS,用好SaaS.同时,也全面展示了SaaS加速器的产品堆栈和最新成果. 上一Part辛总分享了阿里云不敢做SaaS的原因,顺着他的话题我来讲一下我的感受,确实我们是不敢做.不敢做不是因为To B的链条太长,毕竟阿里云现在有To B自有的产品,然后商业以及服务体系里面也建立了自己的一整套班

软件测试面试技巧-面试问题大全

软件测试面试技巧-面试问题大全-Dotest软件测试学堂分享 原文地址:https://blog.51cto.com/dotest/2388153

多线程--面试

50道Java线程面试题(原链接 http://www.importnew.com/21089.html) 下面是Java线程相关的热门面试题,你可以用它来好好准备面试. < 线程的五种状态 线程从创建.运行到结束总是处于下面五个状态之一:新建状态.就绪状态.运行状态.阻塞状态及死亡状态. 1.新建状态(New):         当用new操作符创建一个线程时, 例如new Thread(r),线程还没有开始运行,此时线程处在新建状态. 当一个线程处于新生状态时,程序还没有开始运行线程中的代码