技术侧面经
技术侧面经
并发类面试
多线程
当谈及“多线程”时,一般会问“有几种实现方式”?此类记忆性的问题,对于长期处在真实工作环境下的开发人员来讲是比较被动的,我们应当结合自身的工作思路(思维),来掌控主动权。因为在实际开发中,我们一般不会机械式地穷举、比对、评估所有可能性,所以最好的思考和解答策略是:如果我在工作中,要用到多线程,我会大致如何这项技术的实现要领以及潜在风险?
- 优先使用线程池框架,便于管理线程和问题定位。
- 和项目组约定编码规范,尽量不单独创建线程或重复创建线程池工具,必要时在项目中沉淀线程池工具使用方法。
- 在设计线程池工具时,重点关注:
- 关注业务类型。确定业务属于CPU密集型还是IO密集型,并结合服务器配置合理设置线程数。
- 关注核心参数。重点关注线程数、线程存活时间、等待队列以及拒绝策略的配置。
- 关注资源管理。确保资源安全释放。
- 关注日志埋点。做好日志埋点便于快速定位问题。
线程安全与不安全
当谈及“HashMap与ConcurrentHashMap区别”或“StringBuffer与StringBuilder区别”时,实质上是在问他们二者之间的线程安全问题。对于此类问题,最好的思考和解答策略是:此类问题,本质上是线程安全问题。如果我们在多线程场景下,使用了线程不安全的类,那么会发生业务异常,比如:多个线程同时操作资源,导致业务数据不一致。此时,最好的方式是设计阶段,评估业务是否存在多线程场景,存在则优先考虑使用线程安全的类。
Java内存模型(JMM)
Java内存模型(JMM)属于比较偏底层的基础理论,其本质是Java语言规范中定义的一套内存访问规则。这套规则解决了多线程场景下几个核心问题:
- CPU缓存与内存一致性问题。比如:多级缓存中的数据同步必然存在缓存一致性问题。
- 指令重排序的可见性问题。比如:通过 volatile、synchronized 关键字限制重排序,保证指令执行的有序性.
- 多线程通信的规范问题。
性能类面试
性能相关的面试问题,同样也要极力避免陷入“各类问题的定义、区别、类型”,而应当围绕生产实际展开,比如当线上出现CPU/内存飙升、服务器宕机时,你的应急预案和对策是什么?
- 首先,必须保障服务可用性,确保系统能够正常给用户提供服务
- 其次,通过日志快速定位异常代码,确认业务代码的核心程度,对于非核心业务可以暂时屏蔽,而核心业务需要…
集合类面试
谈及Java中“ArrayList和LinkedList的区别”,其实质区别是二者数据结构的差异,在“查询与操作”时的效率差异。比如 ArrayList 的底层数据结构是数组,数组结构在查询时效率高,而LinkedList是链表结构,在操作时效率高。
谈及“HashMap或HashSet的底层原理”,其实质是要问如何解决Hash冲突问题,比如在HashMap中,会采用“链表+红黑树”的策略来解决哈希冲突问题。