面试难度:★★★★★
考察概率:★★★★★
本人从毕业开始一直在一线互联网大厂工作,现任技术TL,出版过《深入理解Java并发》一书,折腾过技术开源项目,并长期作为面试官参与面试,深谙双方的诉求与技术沟通。如今归零心态,再出发。#莫等闲,白了少年头#
技术交流+v:xxxyxsyy1234(和笔者一起努力,每日打卡) 2000+以面试官视角总结的考点,可与我共同打卡学习
面试官视角
并发是在任何开发语言体系以及工程技能中都是比较难的一个模块,整个并发体系的知识点比较难以理解,同时很多后端框架都绕不开要解决高并发的问题。特别是在真实的业务开发中,一个能够理解并发体系以及解决并发问题的候选者,加入到技术团队是会给团队带来巨大的技术收益的。因此对面试官而言来说,是渴望能够得到一个对并发体系有着深刻理解的候选人的。
另外,由于并发体系内容要想深刻理解,是需要会读懂源码才能掌握业界顶级大佬是如何解决高并发的并发安全问题的,而解决的思路在实际的业务模型构建中也会起到很大的帮助,这块也是考察了候选人的自学钻研能力。
面试题
- java并发体系的整体的体系结构是怎样的,如果要你来完成一个技术语言的并发体系建设,你会有什么思路?
- 从语言历史来说,为什么需要并发?
- 通常而言使用并发会遇到什么问题?
回答要点
1. java并发体系的整体的体系结构是怎样的,如果要你来完成一个技术语言的并发体系建设,你会有什么思路?
整个java并发体系结构如上图所示,从底层的指令支持,衍生到能支持线程安全的lock体系去解决共享变量读写问题。另外在j.u.c包中提供了一系列的并发组件,让开发者能够快速的完成一些支持线程安全的业务组件的开发。在最上层,为了让开发者能够高效的完成业务开发,提供了线程池以及生产者消费者模板,能让开发者高效的完成业务开发。
可加分亮点
面试官心理:候选者能按照从底层到上层完整的阐述整个并发体系的实现,实际上这是一种结构化思维的体现,只有对并发有深刻的理解才能画出这张图以及阐述这个架构支撑。这种结构化思维,在实际工作中是一种很稀缺的思维方式,相信我,如果你能讲出这个逻辑,面试官会两眼放光。
至少在我面试的时候,我都会去问这类问题,我更希望候选者能够有自己的思考,而不是千篇一律的去背八股文
2. 从语言历史来说,为什么需要并发?
- 摩尔定律的消失
摩尔定律并不是一种自然法则或者是物理定律,它只是基于认为观测数据后,对未来的一种预测。
1956年,戈登·摩尔( Gordon moore) 在整理一个关于计算机存储器发展趋势的报告时,通过历史数据绘制图形发现了一个显著的趋势变化。在每个芯片生产后的18~24个月内,每个新生产的芯片是前一个芯片所包含的晶体管的容量的两倍,也就是说其计算能力会翻番。按照这个统计趋势,计算能力相较于时间周期成指数级上升。在摩尔定律的有效性超过半个世纪戛然为止,聪明的硬件工程师并没有停止研发的脚步,为了进一步提升处理性能以及计算速度,不再是追求单一的计算单元,而是通过将多个计算单元进行整合。计算机更倾向于多核CPU的发展趋势,硬件的计算能力以及计算资源的提升也让复杂的业务问题能够迎刃而解。
- 多核计算的发展
当晶体管制造工艺以及CPU散热等多方面的影响时,单核高频的CPU的发展遇到瓶颈,计算机设备往多核心数的发展必不可免。但是,在某些特殊的应用场景如图形渲染、密码破解、图像扫描以及物理以及生物模拟等应用就十分依赖于并行计算。同时在电商等其他业务领域中也需要使用并发实体进行业务解耦,同时提升系统的性能。整体来看,有两点优势:
- 性能提升:通过多线程并发能够充分利用多核心多线程的硬件能力,提升计算效率达到高性能的效果
- 业务拆分:利用多线程能够方便业务拆分,以不同的“线程”的视角去实现不同的业务功能,能够完成流程拆分并彼此独立解耦;
可加分亮点
- 摩尔定律的定义
“摩尔定律”主要有以下3种“版本”:
-
- 集成电路芯片上所集成的电路的数目,每隔18个月就翻一番;
- 微处理器的性能每隔18个月提高一倍,而价格下降一半;
- 用一美元所能买到的计算机性能,每隔18个月翻一番 。
- Amdahl定律
阿姆达尔定律是计算机系统设计的重要定量原理之一,于1967年由IBM360系列机的主要设计者阿姆达尔首先提出。该定律是指:系统中对某一部件采用更快执行方式所能获得的系统性能改进程度,取决于这种执行方式被使用的频率,或所占总执行时间的比例。阿姆达尔定律实际上定义了采取增强(加速)某部分功能处理的措施后可获得的性能改进,或执行时间的加速比
- Gustafson定律
gustafson定律由 John Gustafson首先提出,系统优化某部分所获得的系统性能的改善程度,取决于该部件被使用的频率或所占总执行时间的比例
面试官心理:对业界常识性定律,有一定了解,可反应出候选者的知识面,会有一个好的印象。
3. 通常而言使用并发会需要什么问题?
- 频繁的上下文切换
使用并发涉及到大量的上下文切换,反而使得功能执行时间增加,具体的上下文切换次数以及耗时,可以通过Lmbench3以vmstat工具进行检测(vmstat测量上下文切换的次数,vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况)。过度的使用并发,反而会使得性能下降,使用并发并不是一劳永逸的方式,也不是所有的业务场景的“万能解药”,需要针对问题现状合理的使用并发解决方案。
- 线程安全问题
对线程而言每个线程之间可以共享进程的共享资源,因此,在多线程场景下就会涉及到各个线程对共享资源的读写,如果不注意到并发线程执行的时序以及不去提前评估出线程对共享资源的操作的并发时序是否会影响其他线程的逻辑。那么往往就会因为多线程并发的原因影响程序的正确性,带来十分隐蔽的线程安全问题
代码考核
校招时可能会手撕代码,比如多线程数学加减的题目,还有类似火车票取票的场景,印象中我在校招中就写过多线程累加到1千万的代码
知识点详情
2000+以面试官视角总结的考点,可与我共同打卡学习