架构师必备之面试题整理——多线程并发技术要点!

架构师必备之面试题整理——多线程并发技术要点!

1、概念

什么是线程java

  • 一个线程要执行任务,必须得有线程程序员

  • 一个进程(程序)的全部任务都在线程中执行的面试

  • 一个线程执行任务是串行的,也就是说一个线程,同一时间内,只能执行一个任务

多线程原理编程

  • 同一时间,CPU只能处理1条线程,只有一条线程在工做(执行)windows

  • 多线程并发(同时)执行,其实质是CPU快速的在多线程之间调度(切换)

若是线程过多,会怎样?缓存

  • CPU在N多条线程中调度,会消耗大量的cpu资源数据结构

  • 每条线程被调度执行的频率越低(线程的执行效率低)

多线程的优势多线程

  • 能适当提升程序的执行效率架构

  • 能适当提升资源的利用率(CPU 内存利用率等)

多线程的缺点并发

  • 建立线程是有开销的,iOS下主要成本包括:内核数据结构(大约1KB)、栈空间(子线程512KB、主线程1MB,也可使用-setStackSize:设置,但必须是4K的倍数,并且最小是16K),建立线程大约须要90毫秒的建立时间

  • 若是开启大量的线程,会下降程序的性能

  • 程序越多CPU的线程上的开销就越大

  • 程序设计更加复杂:线程之间的通信,多线程的数据共享

主线程的主要做用

  • 显示和刷新UI界面

  • 处理UI事件(好比点击事件,滚动事件,拖拽事件等)

主线程的使用注意

  • 别将比较耗时的操做放在主线程中,会致使UI界面的卡顿

  • 将耗时操做放在子线程(后台线程,非主线程)

2、多线程的4种方案

架构师必备之面试题整理——多线程并发技术要点!

3、常见多线程面试题:

下面这些是我在不一样时间不一样地点喜欢问的Java线程问题。我没有提供答案,但只要可能我会给你线索,有些时候这些线索足够回答问题。

1.如今有T一、T二、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中怎么解决生产者——消费者问题,固然有不少解决方法,我已经分享了一种用阻塞队列实现的方法。有些时候他们甚至会问怎么实现哲学家进餐问题。

5.你将如何使用thread dump?你将如何分析Thread dump?

在UNIX中你可使用kill -3,而后thread dump将会打印日志,在windows中你可使用”CTRL+Break”。很是简单和专业的线程面试问题,可是若是他问你怎样分析它,就会很棘手。

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

这是我最喜欢的Java线程面试问题,由于即便死锁问题在写多线程并发程序时很是广泛,可是不少侯选者并不能写deadlock free code(无死锁代码?),他们很挣扎。只要告诉他们,你有N个资源和N个线程,而且你须要全部的资源来完成一个操做。为了简单这里的n能够替换为2,越大的数据会使问题看起来更复杂。经过避免Java中的死锁来获得关于死锁的更多信息。

7.你在多线程环境中遇到的共同的问题是什么?你是怎么解决它的?

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

8.为何咱们调用start()方法时会执行run()方法,为何咱们不能直接调用run()方法?

这是一个很是经典的java多线程面试问题。这也是我刚开始写线程程序时候的困惑。如今这个问题一般在电话面试或者是在初中级Java面试的第一轮被问到。这个问题的回答应该是这样的,当你调用start()方法时你将建立新的线程,而且执行在run()方法里的代码。可是若是你直接调用run()方法,它不会建立新的线程也不会执行调用线程的代码。

9.Java中的volatile关键是什么做用?怎样使用它?在Java中它跟synchronized方法有什么不一样?

自从Java 5和Java内存模型改变之后,基于volatile关键字的线程问题愈来愈流行。应该准备好回答关于volatile变量怎样在并发环境中确保可见性、顺序性和一致性。

10.**什么是不可变对象,它对写并发应用有什么帮助?**

另外一个多线程经典面试问题,并不直接跟线程有关,但间接帮助不少。这个java面试问题能够变的很是棘手,若是他要求你写一个不可变对象,或者问你为何String是不可变的。

4、多线程并发的学习思路:

架构师必备之面试题整理——多线程并发技术要点!

5、总结

其实,不少面试官都清楚,初级程序员对于多线程的掌握度几乎为零。可是面试环节中,不少面试官都会抱着试一试的态度去提问一两道多线程的题目。其目的不是为了难为面试者,也不是为了彰显面试的“高大上”,而是为了区分通常人才与优质人才。最后一点你们谨记

在找工做的时候,除了作些相关面试和准备熟悉之前作的项目以外,还应该学习新的知识。毕竟,每多学一点,成功找到工做的机会就大一点。并且,IT这行,技术发展过于快速,若是没有学习新知识的动力,终究会被淘汰。

由于学习实在是很枯燥无味。学习是一个长期投资,短时间很难道看到收益。因此学习这块最好能够给本身定一个目标,天天学习一点,慢慢的会达到的。若是没有动力的话,能够给本身设置奖励。这是能够激发学习的兴趣的。还有一点,今天能坐完的事情,绝对不要留给明天。毕竟,人都是有惰性的。你要相信你本身,今天的你能作的没有作,明天的你也不会作的

写在最后:

欢迎你们关注我新开通的公众号【风平浪静如码】,海量Java相关文章,学习资料都会在里面更新,整理的资料也会放在里面。

以为写的还不错的就点个赞,加个关注呗!点关注,不迷路,持续更新!!!