目录
一、Java线程安全核心原理
🔥 问题1:线程安全的三要素与解决方案
线程安全风险模型
线程安全三要素
synchronized解决方案
🔥 问题2:synchronized底层实现全解析
对象内存布局
Mark Word结构(64位系统)
Monitor工作机制
🔥 问题3:锁优化策略全景解析
锁优化技术矩阵
锁消除示例
二、Spring Boot核心机制解析
🌟 Spring Boot注解体系
常用注解分类表
@SpringBootApplication结构解析
🌟 全局异常处理机制
统一异常处理实现
异常处理优先级
三、高频面试题强化训练
1. synchronized与ReentrantLock的区别?
2. Spring Boot自动配置原理?
3. 如何自定义Spring Boot Starter?
一、Java线程安全核心原理
🔥 问题1:线程安全的三要素与解决方案
线程安全风险模型
线程安全三要素
-
原子性:操作不可分割
-
可见性:修改及时可见
-
有序性:指令顺序可预测
synchronized解决方案
public class Counter {private int value;public synchronized void increment() {value++; // 原子操作}public synchronized int get() {return value; // 内存可见性保证}
}
🔥 问题2:synchronized底层实现全解析
对象内存布局
Mark Word结构(64位系统)
锁状态 | 25bit | 4bit | 1bit(偏向锁) | 2bit(锁标志) |
---|---|---|---|---|
无锁 | hashCode | 分代年龄 | 0 | 01 |
偏向锁 | ThreadID+epoch | 分代年龄 | 1 | 01 |
轻量级锁 | 指向栈中锁记录指针 | - | - | 00 |
重量级锁 | 指向Monitor指针 | - | - | 10 |
GC标记 | - | - | - | 11 |
Monitor工作机制
c++
// hotspot源码节选
ObjectMonitor::enter() {while (_owner != Self) {if (TrySpin(Self) > 0) break; // 自旋优化if (TryLock(Self) > 0) break; // 轻量级锁尝试// 最终进入重量级锁EnterI(Self);}
}
🔥 问题3:锁优化策略全景解析
锁优化技术矩阵
优化技术 | 实现原理 | 适用场景 | JVM参数 |
---|---|---|---|
偏向锁 | 消除无竞争同步 | 单线程重复访问 | -XX:+UseBiasedLocking |
轻量级锁 | CAS自旋代替OS互斥 | 低竞争短时同步 | 默认启用 |
自适应自旋 | 动态调整自旋次数 | 中等竞争场景 | -XX:PreBlockSpin |
锁消除 | 逃逸分析消除同步 | 线程私有对象 | -XX:+DoEscapeAnalysis |
锁粗化 | 合并相邻同步块 | 循环体内同步 | 默认启用 |
锁消除示例
public String concat(String s1, String s2) {StringBuffer sb = new StringBuffer(); // 线程私有对象sb.append(s1);sb.append(s2);return sb.toString(); // JIT自动消除同步锁
}
二、Spring Boot核心机制解析
🌟 Spring Boot注解体系
常用注解分类表
功能类别 | 核心注解 | 说明 |
---|---|---|
启动配置 | @SpringBootApplication | 复合注解包含三大核心 |
Bean定义 | @Component/@Service | 组件声明 |
依赖注入 | @Autowired/@Value | 自动装配与配置注入 |
配置管理 | @ConfigurationProperties | 类型安全配置绑定 |
切面编程 | @Aspect/@Around | AOP切面定义 |
数据访问 | @Entity/@Repository | JPA实体与仓储层标记 |
接口定义 | @RestController | RESTful控制器 |
@SpringBootApplication结构解析
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class)
})
public @interface SpringBootApplication {// 复合注解实现启动三要素
}
🌟 全局异常处理机制
统一异常处理实现
@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(Exception.class)@ResponseBodypublic ResponseEntity<ErrorResult> handleException(Exception ex) {ErrorResult error = new ErrorResult(HttpStatus.INTERNAL_SERVER_ERROR.value(),"系统繁忙,请稍后再试",ex.getMessage());return ResponseEntity.status(500).body(error);}@ExceptionHandler(BusinessException.class)@ResponseBodypublic ResponseEntity<ErrorResult> handleBusinessException(BusinessException ex) {ErrorResult error = new ErrorResult(ex.getCode(),ex.getMessage(),ex.getDetail());return ResponseEntity.status(400).body(error);}
}
异常处理优先级
三、高频面试题强化训练
1. synchronized与ReentrantLock的区别?
维度 | synchronized | ReentrantLock |
---|---|---|
实现机制 | JVM内置 | JDK实现 |
锁特性 | 非公平锁 | 可选公平/非公平 |
条件等待 | wait/notify | Condition对象 |
中断响应 | 不支持 | lockInterruptibly() |
性能 | 优化后接近 | 高竞争下更优 |
2. Spring Boot自动配置原理?
3. 如何自定义Spring Boot Starter?
-
创建配置类
XXXProperties
-
编写自动配置类
XXXAutoConfiguration
-
注册配置到
META-INF/spring.factories
-
打包发布为独立模块
实战建议:
-
使用
@Retryable
实现方法级重试机制 -
通过
@Scheduled
创建定时任务时配置线程池 -
利用
@Async
实现异步处理时监控线程状态
互动问答:
💬 你在项目中如何选择synchronized与Lock?遇到过哪些锁优化案例?
🎁 关注+转发,持续更新《Java,Spring面试题》