2026-06-03 13:07:47
美云智数Java一面面经核心要点总结如下:
1. 自我介绍四大条件
互斥:资源独占,同一时间仅允许一个线程访问。
持有并等待:线程持有资源时继续请求其他资源,超时释放锁可缓解(如设置锁等待超时时间)。
不可剥夺:已分配给线程的资源无法被其他线程强制抢占,需等待线程主动释放。
环路等待:多个线程形成资源请求链(如A等B,B等A),按固定顺序申请资源可避免。
避免死锁的方法
资源顺序获取:所有线程按统一顺序申请锁(如先锁A再锁B)。
锁超时释放:通过tryLock设置超时时间,避免无限等待。
资源预检查:申请锁前判断是否可能引发死锁(如银行家算法)。
若application.yaml与application-dev.yaml存在相同配置项,后者(环境特定文件)优先级更高。
若application-dev.yaml未定义某配置,则回退至application.yaml的默认值。
通过spring.profiles.active=dev指定激活的环境配置文件,Spring Boot自动加载对应文件。
使用#{}预编译语句(自动转义),避免${}直接拼接SQL。
示例:WHERE name LIKE #{keyword}而非WHERE name LIKE '%${keyword}%'。
依赖数据库实现,MyBatis默认支持MySQL的四种隔离级别:
READ UNCOMMITTED(读未提交)
READ COMMITTED(读已提交)
REPEATABLE READ(可重复读,MySQL默认)
SERIALIZABLE(串行化)
SETNX命令:SET key value NX EX seconds(原子性操作,设置键值并过期时间)。
Redisson框架:提供RLock接口,支持可重入、自动续期等高级功能。
需设置合理的过期时间,避免死锁。
释放锁时验证持有者(如通过UUID标识),防止误删他人锁。
日志分析:通过日志级别(ERROR/WARN/INFO)定位异常堆栈。
代码逻辑审查:结合调用链分析潜在问题(如空指针、循环条件错误)。
链路追踪:使用SkyWalking、Zipkin等工具追踪跨服务调用。
数据库监控:通过慢查询日志、EXPLAIN分析SQL性能瓶颈。
指标监控:利用Prometheus+Grafana监控系统指标(如QPS、响应时间)。
实习中遇到技术方案分歧(如缓存策略选择Redis vs. Ehcache)。
数据支撑:通过压测对比两种方案的性能指标(如QPS、延迟)。
团队沟通:组织技术评审会,权衡业务需求、开发成本与维护性。
妥协与迭代:优先实现核心功能,后续通过A/B测试优化方案。
可参考牛客网等平台获取更多真题,重点练习算法题(如LeetCode中等难度)和系统设计题。
分布式系统:CAP理论、Paxos/Raft算法。
性能优化:JVM调优、数据库索引优化、缓存策略。
整体评价:面试涵盖Java核心知识、框架使用及分布式系统设计,注重基础与实战结合,建议候选人梳理项目中的技术难点及解决方案,并提前准备高并发场景下的设计思路。