互联网大厂Java面试:核心知识大考验
面试官:请简要介绍一下Java中的多线程机制,以及它在实际业务场景中的应用。
王铁牛:多线程就是可以同时执行多个任务嘛。在实际业务里,像电商系统的订单处理,多个订单可以同时被处理,就用到了多线程。
面试官:那说说线程池吧,它有什么作用,常用的线程池参数都代表什么含义?
王铁牛:线程池能复用线程,减少创建和销毁线程的开销。参数嘛,corePoolSize是核心线程数,maximumPoolSize是最大线程数……
面试官:还不错。那HashMap在多线程环境下会有什么问题,如何解决?
王铁牛:会有数据丢失啥的问题吧,解决办法嘛,不太清楚。
第一轮结束。
面试官:谈谈JVM的内存模型,以及垃圾回收机制。
王铁牛:内存模型就是有堆、栈、方法区这些。垃圾回收就是把不用的对象回收掉。
面试官:Spring框架中,依赖注入有几种方式,分别是什么?
王铁牛:有构造器注入、setter注入。
面试官:MyBatis的动态SQL有哪些,在实际开发中怎么用?
王铁牛:有if、where、foreach啥的,实际开发中就是根据条件拼接SQL语句。
第二轮结束。
面试官:Dubbo的集群容错策略有哪些,各有什么特点?
王铁牛:有 failover、failfast、failsafe 等,failover 就是失败重试,failfast 是快速失败……
面试官:RabbitMq的消息确认机制是怎样的,有什么作用?
王铁牛:好像有发送确认和接收确认,保证消息可靠传递。
面试官:xxl-job的执行器有哪些类型,分别适用于什么场景?
王铁牛:不太清楚。
第三轮结束。
面试结束,面试官表示会让王铁牛回家等通知。虽然王铁牛对一些复杂问题回答得不太理想,但简单问题的回答还是有一定亮点的。希望他能继续提升自己的技术水平,以备后续可能的机会。
答案
多线程机制:多线程是指在一个程序中可以同时运行多个线程,每个线程执行不同的任务。在Java中,通过Thread类或Runnable接口来创建和管理线程。在实际业务场景中,比如电商系统的订单处理,多个订单可以同时被处理,提高系统的处理效率。
线程池:线程池能复用线程,减少创建和销毁线程的开销。常用参数含义如下:
corePoolSize:核心线程数,当提交的任务数小于corePoolSize时,线程池会创建新线程来执行任务。maximumPoolSize:最大线程数,当提交的任务数大于corePoolSize时,会将任务放入队列中,如果队列已满且线程数小于maximumPoolSize,则会创建新线程来执行任务。keepAliveTime:线程池中的线程在空闲时的存活时间。unit:keepAliveTime的时间单位。workQueue:任务队列,用于存放提交的任务。threadFactory:线程工厂,用于创建线程。handler:拒绝策略,当线程池已满且无法接受新任务时,会调用该策略来处理新任务。
HashMap在多线程环境下的问题及解决办法:在多线程环境下,HashMap可能会出现数据丢失、死循环等问题。解决办法有:
- 使用
ConcurrentHashMap代替HashMap,ConcurrentHashMap是线程安全的。 - 对
HashMap进行同步处理,比如使用synchronized关键字。
JVM的内存模型及垃圾回收机制:JVM的内存模型包括堆、栈、方法区等。垃圾回收机制是自动回收不再使用的对象所占用的内存空间。常见的垃圾回收算法有标记清除算法、标记整理算法、复制算法等。
Spring框架中的依赖注入方式:
- 构造器注入:通过构造函数来注入依赖对象。
- setter注入:通过setter方法来注入依赖对象。
MyBatis的动态SQL:
- if:根据条件判断是否拼接SQL语句。
- where:自动处理SQL语句中的WHERE关键字,避免多余的AND或OR。
- foreach:用于循环遍历集合,生成对应的SQL语句。
Dubbo的集群容错策略:
- failover:失败重试,当调用失败时会自动重试其他服务。
- failfast:快速失败,当调用失败时立即抛出异常。
- failsafe:失败安全,当调用失败时不抛出异常,而是记录日志。
RabbitMq的消息确认机制:
- 发送确认:确保消息成功发送到RabbitMq服务器。
- 接收确认:确保消费者成功接收到消息。
xxl-job的执行器类型及适用场景:
- BEAN模式:适用于执行本地方法。
- GLUE模式:适用于在线编辑代码并执行。
- EXECUTOR模式:适用于分布式任务执行。