六、Spring AOP动态代理机制
核心实现原理
1. JDK动态代理:基于接口的CGLIB字节码增强(需实现InvocationHandler接口)
2. CGLIB代理:通过继承目标类生成子类实现代理(MethodInterceptor拦截器)
3. 切面执行顺序:@Around > @Before > 目标方法 > @AfterReturning/@AfterThrowing
java
// 自定义切面示例
@Aspect
@Component
public class LogAspect {
@Pointcut("@annotation(com.example.Loggable)")
public void logPointcut() {}
@Around("logPointcut()")
public Object logExecution(ProceedingJoinPoint joinPoint) throws Throwable {
long start = System.currentTimeMillis();
Object result = joinPoint.proceed();
logger.info("方法执行耗时: {}ms", System.currentTimeMillis() - start);
return result;
}
}
七、数据库连接池工作机制
核心运行机制
1. 连接创建:初始化时预创建最小连接数(如HikariCP默认10)
2. 连接获取:采用BlockingQueue实现连接等待队列
3. 连接回收:空闲超时(如30秒)自动关闭,泄漏检测机制
java
// HikariCP核心配置示例
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/test");
config.setMaximumPoolSize(20); // 最大连接数
config.setIdleTimeout(30000); // 空闲超时时间
HikariDataSource dataSource = new HikariDataSource(config);
关键技术点
1. 连接泄露检测:addConnectionEventListener监听连接状态
2. 性能优化:FastList替代ArrayList减少锁竞争
3. 验证机制:testOnBorrow/testWhileIdle配置
八、分布式锁实现方案对比
主流实现方式
方案 实现原理 优点 缺点
Redis :RedLock 多节点RedLock算法; 高性能,可重入; 需要3/5节点部署
ZooKeeper :临时有序节点+Watcher ;强一致性,自动释放 ;性能较低,依赖运维
数据库乐观锁 :版本号/状态字段更新 ;实现简单,无需额外组件 ;并发能力差,存在死锁风险
java
// Redisson可重入锁示例
RLock lock = redissonClient.getLock("orderLock");
try {
if (lock.tryLock(10, 30, TimeUnit.SECONDS)) {
// 业务逻辑
}
} finally {
lock.unlock();
}
九、Java内存模型(JMM)与可见性问题
核心内存屏障
1. LoadLoad:保证后续读操作读取最新值
2. StoreStore:保证后续写操作在前序写完成后执行
3. LoadStore:保证读操作后的写操作可见性
java
// volatile的happens-before保证
class VolatileExample {
volatile boolean flag = false;
int data = 0;
public void writer() {
data = 42; // 1
flag = true; // 2(Store屏障)
}
public void reader() {
if (flag) { // 3(Load屏障)
System.out.println(data); // 保证读取42
}
}
}
典型问题场景
1. 双重检查锁定失效:未使用volatile的单例模式
2. 指令重排序:单例模式中对象构造未完成就被发布
3. 缓存一致性协议:MESI协议如何保证多核数据同步
十、ReentrantLock与synchronized对比
核心差异对比
特性 ReentrantLock synchronized
锁获取方式: 阻塞/可中断/超时; 阻塞
锁公平性 :支持公平锁 ;非公平锁
条件变量 :多Condition实现 ;单一等待集
锁状态感知: isLocked()方法 ;无直接API
性能损耗: CAS自旋+park/unpark ;内核态互斥量
java
// ReentrantLock公平锁示例
ReentrantLock fairLock = new ReentrantLock(true);
fairLock.lock();
try {
// 临界区代码
} finally {
fairLock.unlock();
}
高级应用场景
1. 读写锁优化:StampedLock的乐观读机制
2. 锁降级策略:Condition的await/unpark控制
3. 自旋锁实现:减少线程上下文切换