Java面试高频问题(6-10)

六、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. 自旋锁实现:减少线程上下文切换

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值