去哪儿网春招Java开发一面面经
面试题目
- 自我介绍
- 实习项目的深度拷打,重点阐述项目中技术含量最高的部分
- SQL慢查询的解决思路
- 乐观锁的实现原理
- 结合项目进行相关技术延申提问
- 手撕代码:线程A打印数字1-7,线程B打印字母A-G,要求输出1A2B…7G。面试官补充追问:为何使用wait(),对比Object.wait()与Thread.sleep()的区别。
- 反问环节
参考解析
- SQL慢查询优化:先通过EXPLAIN分析执行计划,查看是否命中索引。检查SQL语句是否存在全表扫描、大批量数据排序、不必要的JOIN或字段选取过多。进一步可优化索引结构、改写SQL、或者通过数据库分库分表解决。
- 乐观锁实现:通常使用版本号(Version)或CAS机制实现。在更新数据时,先读取数据的版本号,在更新时校验版本号是否改变。如果相等则更新成功,不等则重试或失败。
- 线程交替打印:可使用
synchronized配合wait/notify,或者ReentrantLock配合Condition来实现。核心思路是两个线程持有同一把锁,通过状态标记位交替唤醒对方。 - wait() vs sleep():
wait()会释放锁对象,进入等待队列,需由notify/notifyAll唤醒;sleep()不释放锁资源,仅在指定时间内让出CPU执行权,常用于定时轮询或间隔执行。