Java|分享一次对我而言惊心动魄的Java面试

记录一次面试的题和自己的一些理解,通常一般都是自我介绍,项目介绍,问问业务以及后面就是吧拉吧拉的技术细节,反正一句话 “面试过程都是一连串的连环 Q”。如果大家觉得这些问题都能够游刃有余的回答大家出去拿一个高级的 title 问题不大。
分布式锁部分

  1. redis 分布式锁超时后,第二个线程进入过后会有什么影响?
无法保证幂等,可能发生未知问题。
  1. 分布式锁锁超时如何实现?
主线程中,增加延迟队线程池实现。
  1. 2000 个线程持有锁如何续期呢?
框架实现:应该是一个定时任务。 redisson 使用的是 netty 提供的 TimerTask 延迟任务或者采用 ScheduledThreadPoolExecutor 就算是 2000 个任务,也不会开启两千个线程本质是通过优先级队列排排队
  1. 锁不设置过期时间有什么问题?
会造成死锁
  1. 分布式锁如何实现锁重入?
hash 实现,存储,keyid (uuid)
J.U.C 部分
  1. ReentrantLock 公平和非公平?
ReentrantLock 默认非公平,公平锁首先入队 AQS ,非公平锁会执行抢锁的逻辑。
非公平加锁过程
  • 直接加锁 (加锁)
  • 无锁加锁,判断重入 (加锁)
  • 入队前加锁(加锁)
  • pack
公平锁加锁过程
  • 无锁加锁,判断重入 (加锁)
  • 入队前加锁(加锁)
  • pack
  1. ReentrantLock 解锁过程?
解锁从队头唤醒,LockSport.unpark(threadId)
  1. synchronized 锁升级过程 ?
无锁,一个线程是偏向锁,轻量级锁,然后变为重量级锁。
  1. 偏向锁如何升级为轻量级锁?
存在多个线程抢锁的过程中。
  1. volatile 如何保证可见性?
通过 storeload 内存屏障实现的 在 hotsport 源码中,内部使用了 lock 指令
  1. 内存屏障怎么加的?
底层就是使用汇编的 lock 指令或者使用系统 api
  1. 读写屏障怎么加的?
读屏障,其实就是在读取之前加读屏障,设置 CPU 缓存失效,在主内存中读取数据 写屏障,其实就是在写数据之后加写屏障,将 CPU 的缓存数据,刷入主内存
Redis 部分
  1. redis 过期策略?
lru , lfu 区别
  • lru 优化 , lru-1 ==> lru-k 就是说一个历史队列,和一个缓存队列 冷热数据分离,优先清理冷数据
  • lfu 存在问题,就是会有一个引用计数,内存占用很高。
  1. key 失效策略?
惰性删除 定时删除 (key 增加一个定时) 定期删除 (固定周期删除)
  1. redis 高可用集群
sentinel 和 redis cluster 集群
  1. 集群的区别?系统中如何选择?(什么时候用 redis sentinel? 什么时候用 redis cluster?)
区别: redis sentinel 只有一个主节点。 redis cluster 多个主节点,能够提供强的服务能力。
  1. redis cluster 如何重新选举,选举过程中,需要考虑那些因素?
  2. 如果 salve 发现 master 不可用
  3. id 增加 记录集群的 currentEpoch + 1, 广播 FAILOVER_AUTH_REQUEST 信息
  4. **客户端应答(主节点参与选举):**收到其他其他的节点信息,每个节点都发一个 ack
  5. 过半机制,确认选举成功
  6. 最后广播到所有的节点
  7. redis 集群模式下,如何指定两个 key 在一个槽或者节点中。
Redis Cluster在计算hash slot的时候,会同时计算一个特例就是 hash tag。这个作用是什么呢?是确保两个键都在同一个哈希槽里。举个例子: mset {user1}:1:name zhangsan {user1}:1:age 18 只会通过 user1 来计算。
MySQL 和索引
  1. 复合索引 a,b 列,查询命中两条数据索引中数据查询过程?
【Java|分享一次对我而言惊心动魄的Java面试】按照最左前缀原子匹配索引数据,匹配到了,一个复合索引的叶子节点,关联的是一批主键id , 然后回表查询数据。
  1. mvcc 机制?
mvcc 机制,是一个并发访问控制, 针对读已提交,可重复读的事务隔离级别。 在读已提交 ,能够读取到最新的数据,能拿到这条数据读取的一个事物提交的版本链。 在可重复读 ,会记录事务开启后的第一个读取的 viewid 所以就可以保证重复。
  1. binlog, redo log undo log 发生的顺序。
binlog 是数据库 server 级别的 redo log undo log 是引擎级别的。 binlog 是在事务提交的时候才会去刷盘
Java|分享一次对我而言惊心动魄的Java面试
文章图片


参考:zhuanlan.zhihu.com/p/213770128
  1. 如果事务提交了 binlog 没有记录成功会怎么样?
binlog 记录成功才标志事务提交成功。 参考同上
Spring 部分 mybatis 的 bean 如何被注入的? 其实会更具 spring-starter 机制在 spring-boot 启动的时候,初始化配置类。
@mapper 注解如何被是转换为 bean 的 其实这里主要是通过 MapperFactoryBean 生成一个代理对象,然后注入进去。

原文链接:https://juejin.cn/post/7096838452636811272

    推荐阅读