《互联网大厂Java求职者面试:核心知识大考验》

36 阅读4分钟

面试官:请简要介绍一下 Java 中的多线程,以及它在实际业务场景中的应用。

王铁牛:多线程就是一个程序里可以同时执行多个线程。在业务场景中,比如电商系统里的订单处理,一个线程负责接收订单,一个线程负责库存检查,这样可以提高处理效率。

面试官:嗯,回答得不错。那再说说线程池吧,它有哪些优点以及如何合理配置线程池参数?

王铁牛:线程池优点就是可以复用线程,减少线程创建销毁开销。配置参数嘛,核心线程数得根据任务类型和数量来定,最大线程数不能太大也不能太小,队列容量也得考虑任务积压情况。

面试官:很好。接下来进入第二轮,讲讲 JVM 的内存模型,以及垃圾回收机制是怎样的?

王铁牛:JVM 内存模型就是有堆、栈、方法区这些。垃圾回收机制就是通过标记清除、复制、标记整理等算法来回收不再使用的内存。

面试官:那类加载机制又是什么情况呢?

王铁牛:类加载机制就是把类从字节码文件加载到内存里,有加载、验证、准备、解析、初始化这些步骤。

面试官:这轮表现也还行。最后一轮,说说 Spring 框架中依赖注入的几种方式,以及它们的区别。

王铁牛:有构造器注入、setter 注入,构造器注入是通过构造函数注入依赖,setter 注入是通过 setter 方法注入。区别嘛,构造器注入能保证依赖完整,setter 注入更灵活。

面试官:好的,今天的面试就到这里,回去等通知吧。

答案

  • 多线程:多线程是指在一个程序中可以同时运行多个线程,每个线程执行不同的任务。在电商系统中,接收订单、库存检查等操作可以由不同的线程并行处理,提高系统的处理效率。例如,使用 Thread 类创建线程,通过 start() 方法启动线程。
  • 线程池:线程池的优点包括复用线程、减少线程创建和销毁的开销、便于线程管理等。合理配置线程池参数时,核心线程数应根据任务类型和数量来确定,比如对于 CPU 密集型任务,核心线程数可以适当多一些;最大线程数要避免过大导致系统资源耗尽或过小无法应对高并发任务;队列容量则要考虑任务积压情况,防止任务丢失。可通过 ThreadPoolExecutor 类来创建和配置线程池。
  • JVM 内存模型:JVM 内存模型包括堆、栈、方法区等。堆是对象实例存储的地方;栈主要存放局部变量和方法调用的上下文;方法区存储类信息、常量、静态变量等。垃圾回收机制通过标记清除、复制、标记整理等算法来回收不再使用的内存。例如,标记清除算法会先标记出可回收的对象,然后统一清除;复制算法会将存活对象复制到新的内存区域;标记整理算法会先标记存活对象,然后将它们移动到内存的一端,最后清理另一端的内存。
  • 类加载机制:类加载机制是将类从字节码文件加载到内存的过程,包括加载、验证、准备、解析、初始化等步骤。加载是将字节码文件读入内存并创建 Class 对象;验证是检查字节码的正确性;准备是为类的静态变量分配内存并设置初始值;解析是将符号引用转换为直接引用;初始化是执行类的静态代码块和为静态变量赋值。
  • Spring 依赖注入:依赖注入的方式有构造器注入和 setter 注入。构造器注入是通过构造函数传入依赖对象,这种方式能保证依赖对象在对象创建时就已完整注入,且一旦注入不可变。例如:public class UserService { private final UserDao userDao; public UserService(UserDao userDao) { this.userDao = userDao; } }。setter 注入是通过 setter 方法注入依赖对象,更加灵活,对象创建后可以动态更换依赖。例如:public class UserService { private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; } }