熙牛医疗java一面面经
《面试题目》
- 简单介绍下自己
- 介绍下实习经历里的优化线上逻辑接口
- 为什么用异步线程池,不直接改远程调用的逻辑?
- 聊聊实习经历里的easyexcel的跨行合并。
- hashmap的底层结构讲一讲。
- 线程池里的几个属性是干什么的?
- 它的拒绝策略有哪些?
- java中synchronized的锁升级过程是什么?
- 在偏向锁、轻量级锁、重量级锁时,是怎么体现哪个线程持有这个锁的?
- java中除了synchronized还有lock,基于aqs框架实现的锁,aqs是什么样子的?
- aqs里面的状态变量,是通过什么方式去获取的?
- 里面的可重入锁,是怎么去体现可重入性的?
- 怎么体现公平和非公平呢?
- mysql的事务隔离级别有哪些?
- mysql里遇到了慢sql,该怎么去排查呢?
- 亿级数据量表,怎么去提高查询效率呢?
- 如果分表的话,会有怎样的考虑?
- 如果sql的时候遇到了死锁问题,应该怎么办呢?
- redis持久化策略。
- redis淘汰策略。
- jvm相关问题。
- 反问环节。
《参考解析》
- 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(报错)。