Java全栈面试宝典:多线程与Spring核心机制深度解析
目录
一、并发编程核心概念
🔥 问题1:进程与线程的六大维度对比
系统资源管理架构图
核心差异对照表
内核态与用户态对比
问题2:Java线程模型的三层架构
JVM线程模型图解
Java线程生命周期代码示例
二、Spring核心机制解析
🌟 Spring四层架构体系
Spring模块全景图
🌟 依赖注入(DI)深度解析
DI实现方式对比表
Spring DI容器工作原理
三、高频面试题强化训练
1. Spring依赖注入的优势
2. BeanFactory与ApplicationContext的区别进阶
3. Spring Bean作用域
四、Java并发编程实战技巧
1. 线程池最佳配置
2. 线程安全集合选择指南
一、并发编程核心概念
🔥 问题1:进程与线程的六大维度对比
系统资源管理架构图
核心差异对照表
对比维度 | 进程 | 线程 |
---|---|---|
资源分配单位 | 操作系统分配 | 进程内部分配 |
内存空间 | 独立地址空间(4GB/进程) | 共享进程内存 |
通信方式 | 管道/信号量/共享内存 | 共享变量/消息队列 |
上下文切换开销 | 高(需切换页表) | 低(仅寄存器) |
健壮性 | 进程崩溃不影响其他进程 | 线程崩溃导致整个进程终止 |
创建销毁开销 | 大(MB级) | 小(KB级) |
内核态与用户态对比
执行模式 | 访问权限 | 切换触发条件 | 典型操作 |
---|---|---|---|
用户态 | 受限的系统资源访问 | 系统调用/中断 | 应用程序常规代码执行 |
内核态 | 完全的系统资源控制 | 中断处理完成返回 | 设备驱动/I/O操作 |
切换原理:通过系统调用(如fork/exec)触发软中断(0x80),CPU切换到特权模式
问题2:Java线程模型的三层架构
JVM线程模型图解
Java线程生命周期代码示例
public class ThreadLifecycle {
public static void main(String[] args) {
Thread thread = new Thread(() -> {
System.out.println("子线程运行中");
try {
Thread.sleep(1000); // TIMED_WAITING
} catch (InterruptedException e) {
e.printStackTrace();
}
});
System.out.println(thread.getState()); // NEW
thread.start();
System.out.println(thread.getState()); // RUNNABLE
}
}
二、Spring核心机制解析
🌟 Spring四层架构体系
Spring模块全景图
🌟 依赖注入(DI)深度解析
DI实现方式对比表
注入方式 | 实现示例 | 适用场景 | 优势 |
---|---|---|---|
构造器注入 | new ServiceImpl(dependency) | 强依赖关系 | 对象不可变/线程安全 |
Setter注入 | service.setDao(dao) | 可选依赖 | 灵活性高 |
字段注入 | @Autowired private Dao dao | 快速开发 | 代码简洁 |
方法注入 | @Autowired public void init(Dao dao) | 复杂初始化逻辑 | 精确控制注入时机 |
Spring DI容器工作原理
三、高频面试题强化训练
1. Spring依赖注入的优势
-
解耦组件关系:通过接口编程降低耦合度
-
增强可测试性:方便Mock对象进行单元测试
-
提升可维护性:配置集中管理,修改不影响业务代码
-
支持灵活扩展:通过替换实现类快速变更功能
2. BeanFactory与ApplicationContext的区别进阶
特性 | BeanFactory | ApplicationContext |
---|---|---|
国际化支持 | ❌ | ✅(MessageSource) |
事件发布 | ❌ | ✅(ApplicationEventPublisher) |
资源模式解析 | 基础支持 | 支持Ant风格路径 |
注解驱动 | 需手动配置 | 自动检测(@ComponentScan) |
Profile支持 | ❌ | ✅ |
3. Spring Bean作用域
@Scope("prototype") // 每次获取新实例
@Scope("singleton") // 默认单例
@Scope("request") // Web请求范围
@Scope("session") // 用户会话范围
@Scope("application")// ServletContext生命周期
四、Java并发编程实战技巧
1. 线程池最佳配置
ExecutorService pool = new ThreadPoolExecutor(
5, // 核心线程数(CPU密集型建议N+1)
20, // 最大线程数(IO密集型建议2N)
60L, TimeUnit.SECONDS, // 空闲线程存活时间
new LinkedBlockingQueue<>(100), // 任务队列(根据业务选择队列类型)
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略
);
2. 线程安全集合选择指南
集合类型 | 线程安全实现 | 适用场景 |
---|---|---|
List | CopyOnWriteArrayList | 读多写少 |
Map | ConcurrentHashMap | 高并发读写 |
Set | ConcurrentSkipListSet | 需要排序功能 |
Queue | LinkedBlockingQueue | 生产者-消费者模式 |
实战建议:
-
在Spring Boot中使用
@Async
实现异步任务处理 -
通过
ThreadLocal
实现请求上下文传递 -
使用
ConcurrentHashMap
代替synchronizedMap
提升并发性能
💬 你在项目中如何处理线程安全问题?遇到过哪些并发编程的"坑"?
🎁 关注+转发,抽送《阿里巴巴Java开发手册》电子书