熙牛医疗java一面面经

熙牛医疗 · java · 一面 · 2026-03

《面试题目》

  1. 简单介绍下自己
  2. 介绍下实习经历里的优化线上逻辑接口
  3. 为什么用异步线程池,不直接改远程调用的逻辑?
  4. 聊聊实习经历里的easyexcel的跨行合并。
  5. hashmap的底层结构讲一讲。
  6. 线程池里的几个属性是干什么的?
  7. 它的拒绝策略有哪些?
  8. java中synchronized的锁升级过程是什么?
  9. 在偏向锁、轻量级锁、重量级锁时,是怎么体现哪个线程持有这个锁的?
  10. java中除了synchronized还有lock,基于aqs框架实现的锁,aqs是什么样子的?
  11. aqs里面的状态变量,是通过什么方式去获取的?
  12. 里面的可重入锁,是怎么去体现可重入性的?
  13. 怎么体现公平和非公平呢?
  14. mysql的事务隔离级别有哪些?
  15. mysql里遇到了慢sql,该怎么去排查呢?
  16. 亿级数据量表,怎么去提高查询效率呢?
  17. 如果分表的话,会有怎样的考虑?
  18. 如果sql的时候遇到了死锁问题,应该怎么办呢?
  19. redis持久化策略。
  20. redis淘汰策略。
  21. jvm相关问题。
  22. 反问环节。

《参考解析》

  • synchronized锁升级与持有标记:锁的状态存储在对象头的Mark Word中。偏向锁存储持有线程ID;轻量级锁通过CAS操作将Mark Word存入栈帧的锁记录(Lock Record);重量级锁则指向互斥量(Monitor),线程进入等待队列。
  • AQS可重入性:AQS通过state变量记录重入次数。当线程获取锁时,若当前线程已持有锁,state+1;释放锁时state-1。当state归零时,说明锁已完全释放,允许其他线程竞争。
  • 亿级数据量查询优化:主要手段包括索引优化(覆盖索引、联合索引)、分库分表(水平/垂直拆分)、读写分离,以及使用Elasticsearch等搜索引擎承担复杂查询,必要时进行冷热数据归档。
  • MySQL死锁处理:死锁本质是资源循环等待。预防策略包括:控制加锁顺序(始终按固定顺序访问资源)、缩短事务持锁时间、尽量降低隔离级别、在大批量操作时尽量按主键范围处理,避免大事务嵌套。
  • Redis淘汰策略:重点记忆 volatile-lru(设置过期时间的key中LRU)、allkeys-lru(所有key中LRU)、volatile-lfu(设置过期时间的key中LFU)、allkeys-random(随机删除)、noeviction(报错)。