目錄
????????一、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面試題》