面灵AI

百度秋招后端一面:并发集合、线程池与主从延迟

轮次
一面
时间
2026-09
来源
牛客网

《面试题目》

  1. JDK 8 的 HashMap 做了哪些优化,put 的流程是什么?
  2. HashMap 与 ConcurrentHashMap 的写入并发控制有什么区别?
  3. volatile 能保证什么,两个线程各自对初值为 1 的变量执行一次自增会得到什么?
  4. ConcurrentHashMap 怎样统计 size,并发时结果有什么边界?
  5. 字符串拼接有哪些方式,各有什么特点?
  6. Java 常见锁、synchronized 与 happens-before 如何理解?
  7. 线程池怎样接收任务,核心线程数与最大线程数为什么分开?
  8. ThreadLocal 为什么可能泄漏?
  9. 怎样查看 CPU、内存与磁盘 IO?
  10. MySQL 如何处理不可重复读与幻读?
  11. redo log、undo log 和 binlog 各做什么,一次更新怎样协调日志?
  12. 主从复制如何工作,从库延迟很大时怎样定位?
  13. 如何实现 LRU 缓存?

《参考解析》

volatile 自增

在主线程等两次自增都结束后再读取,结果可能是 2 或 3。volatile 保证可见性和相应的顺序约束,但读取、加一、写回仍是多个动作。需要原子计数时用原子类或锁。普通 HashMap 的 put 也没有因此变成带 CAS 的线程安全操作,应先纠正题目的对象。

主从延迟

把复制链路拆成主库产生日志、传输、从库接收和应用几个阶段。比较积压位置,再看网络、磁盘、长事务、锁等待和应用并行度。只看一个延迟秒数无法区分是传不动,还是收到以后执行不动。

线程池队列

达到核心线程数后通常先排队,队列不能接收才继续增加到最大线程数。无界队列可能让最大线程数难以发挥作用;高峰期要同时评估排队时延、堆积内存和拒绝策略。