面试复习:Java 并发与 JVM(初中高级)—— 线程池 / 锁 / AQS / JMM / 虚拟线程 / GC 选型 / 线上排查
按🌱初级/🌿中级/🌳高级三层整理的并发与 JVM 复习笔记:线程池参数与治理、synchronized 锁升级、AQS、volatile 与 JMM、ThreadLocal、CompletableFuture、虚拟线程,以及内存模型、G1/ZGC 选型、类加载、OOM 与线上排查思路。
从一个关键词,发现新的思路。
按🌱初级/🌿中级/🌳高级三层整理的并发与 JVM 复习笔记:线程池参数与治理、synchronized 锁升级、AQS、volatile 与 JMM、ThreadLocal、CompletableFuture、虚拟线程,以及内存模型、G1/ZGC 选型、类加载、OOM 与线上排查思路。
积分服务变慢,订单服务接口全部超时,CPU 却只有 5%。jstack 看到 200 个 Tomcat 线程都阻塞在 socket read 与连接池里,根因是没设超时、队列无界、没有隔离。附拒绝策略与超时、舱壁隔离的落地写法。
服务进程在、端口通、健康检查也过,但所有业务请求都卡住,CPU 只有 2%。jstack 直接报出 Found one Java-level deadlock。本文含最小可复现代码、输出逐行解读,以及锁顺序统一、tryLock 超时、缩小锁粒度三种修法。
同一笔账被两个实例同时处理,锁明明加了。从 redis-cli 现场查锁 key 与 TTL 入手,讲清锁过期自动释放、误删他人锁、Redisson 看门狗只在不传 leaseTime 时续期、unlock 抛 IllegalMonitorStateException,以及主从切换丢锁与 Redlock 争议。
把 ArrayList、HashMap、ConcurrentHashMap、LinkedHashMap、PriorityQueue 的底层原理、扩容机制和选型建议讲清楚,重点记录 ConcurrentHashMap 的 size 不准、HashMap 死循环、subList 导致 OOM、 Arrays.asList 不可变这些真实踩过的坑。
从 ThreadPoolExecutor 的执行流程讲到生产环境线程池打满的完整排查链路:核心参数怎么算、JUC 常用组件怎么选、Executors 为什么不能用、CompletableFuture 默认线程池的坑,以及一次千万级短信发送任务把线程池压满的真实复盘。