百度秋招后端一面:并发集合、线程池与主从延迟
- 轮次
- 一面
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
- JDK 8 的 HashMap 做了哪些优化,put 的流程是什么?
- HashMap 与 ConcurrentHashMap 的写入并发控制有什么区别?
- volatile 能保证什么,两个线程各自对初值为 1 的变量执行一次自增会得到什么?
- ConcurrentHashMap 怎样统计 size,并发时结果有什么边界?
- 字符串拼接有哪些方式,各有什么特点?
- Java 常见锁、synchronized 与 happens-before 如何理解?
- 线程池怎样接收任务,核心线程数与最大线程数为什么分开?
- ThreadLocal 为什么可能泄漏?
- 怎样查看 CPU、内存与磁盘 IO?
- MySQL 如何处理不可重复读与幻读?
- redo log、undo log 和 binlog 各做什么,一次更新怎样协调日志?
- 主从复制如何工作,从库延迟很大时怎样定位?
- 如何实现 LRU 缓存?
《参考解析》
volatile 自增
在主线程等两次自增都结束后再读取,结果可能是 2 或 3。volatile 保证可见性和相应的顺序约束,但读取、加一、写回仍是多个动作。需要原子计数时用原子类或锁。普通 HashMap 的 put 也没有因此变成带 CAS 的线程安全操作,应先纠正题目的对象。
主从延迟
把复制链路拆成主库产生日志、传输、从库接收和应用几个阶段。比较积压位置,再看网络、磁盘、长事务、锁等待和应用并行度。只看一个延迟秒数无法区分是传不动,还是收到以后执行不动。
线程池队列
达到核心线程数后通常先排队,队列不能接收才继续增加到最大线程数。无界队列可能让最大线程数难以发挥作用;高峰期要同时评估排队时延、堆积内存和拒绝策略。