01
60 秒回答模板
可以这样回答:同一个对象里的两个 synchronized 实例方法使用的是同一把对象 monitor 锁。两个线程分别调用同一对象的两个 synchronized 方法时会互斥,先获得锁的线程执行,另一个线程进入 BLOCKED 等待。 synchronized 实例方法进入时等价于对 this 执行 monitorenter,退出时 monitorexit。只要是同一个实例,所有 synchronized 实例方法竞争同一个 monitor;如果是两个不同实例,就各自有锁,不互斥。 对象级锁简单但锁粒度可能偏粗,多个互不相关的方法也会互斥。若临界区可以拆分,可以用不同锁对象或更细粒度的 Lock 降低竞争,但会增加死锁和维护复杂度。 静态 synchronized 方法锁的是类对象,不和普通实例方法的 this 锁直接互斥。异常退出 synchronized 也会自动释放 monitor。 验证时重点看:排查时看线程 dump 中 BLOCKED 的 monitor 对象、持锁线程、调用栈、锁等待时间和是否存在不必要的大临界区。
考点 考点边界
主线 核心机制
易错点 以为两个 synchronized 方法各有一把锁,忽…
02
深入解析
01 考点边界
这题问 synchronized 锁对象,不是 Linux 线程概念。回答要区分实例方法锁 this、静态方法锁 Class 对象、不同实例互不影响,以及 wait/notify 也基于同一 monitor。 本题对应“同一对象 synchronized 实例方法锁竞争”,核心前提是:同一个对象里的两个 synchronized 实例方法使用的是同一把对象 monitor 锁。两个线程分别调用同一对象的两个 synchronized 方法时会互斥,先获得锁的线程执行,另一个线程进入 BLOCKED 等待。
02 核心机制
synchronized 实例方法进入时等价于对 this 执行 monitorenter,退出时 monitorexit。只要是同一个实例,所有 synchronized 实例方法竞争同一个 monitor;如果是两个不同实例,就各自有锁,不互斥。 关键证据要落到线程状态、锁队列、内存可见性、运行时指标,这样才能说明机制为什么能支撑题目结论。如果继续展开,要对应到线程状态、锁队列、CAS 失败、内存可见性、GC Roots、线程 dump 或运行时指标。
03 关键取舍
对象级锁简单但锁粒度可能偏粗,多个互不相关的方法也会互斥。若临界区可以拆分,可以用不同锁对象或更细粒度的 Lock 降低竞争,但会增加死锁和维护复杂度。 因此要结合线程状态、锁等待、内存可见性、GC 或运行时指标判断,而不是只比较 API 名称。 这些取舍决定了方案在不同输入规模、延迟、内存、并发、泛化或一致性要求下是否仍然成立。
04 边界风险
静态 synchronized 方法锁的是类对象,不和普通实例方法的 this 锁直接互斥。异常退出 synchronized 也会自动释放 monitor。 排查时优先看 jstack、GC 日志、heap dump、锁等待、CAS 失败、线程池队列和业务超时。 需要特别关注极端输入、数据分布变化、资源不足、并发竞争或观测口径错误带来的退化。修复时要先拿到线程 dump、GC 或 heap 证据,再区分锁竞争、对象泄漏、线程池耗尽和配置不合理。
05 验证抓手
验证时要看锁等待时间、线程状态、CAS 失败率、重试次数、死锁日志、数据库锁等待、吞吐和尾延迟。能把抽象锁策略落到这些信号,答案才像真实工程排查。 针对本题,最有价值的验证信号是:排查时看线程 dump 中 BLOCKED 的 monitor 对象、持锁线程、调用栈、锁等待时间和是否存在不必要的大临界区。把验证抓手说出来,可以让答案从知识点延伸到并发行为、线程状态和运行时排查。
03
易错点
- 以为两个 synchronized 方法各有一把锁,忽略同一对象实例共享 monitor。
- 混淆实例方法锁 this 和静态方法锁 Class 对象。
- 把相邻概念混用,没有明确说明这道题真正考察的边界。
- 没有给出验证方式,导致答案听起来完整但无法判断是否真的生效。
04
面试官追问
synchronized 实例方法锁的到底是什么?
锁的是当前实例 this 的 monitor。同一实例上的多个 synchronized 实例方法共享这把锁,因此不同方法之间也会互斥。
静态 synchronized 方法和实例 synchronized 方法会互斥吗?
默认不会。静态 synchronized 锁的是 Class 对象,实例 synchronized 锁的是具体 this 对象,除非代码里还使用了同一把外部锁。
“同一个对象中两个 synchronized ”继续追问时最该补哪条边界?
应该围绕“同一对象 synchronized 实例方法锁竞争”补适用前提、失败场景和验证证据。先说明哪些条件下这个机制成立,再说明哪些输入规模、并发状态、数据分布或资源限制会让答案需要调整。
“同一个对象中两个 synchronized ”怎样回答才不是只背概念?
看它能否把“同一对象 synchronized 实例方法锁竞争”的机制链路、关键取舍和可观测信号连起来。回答时应落到具体状态变化、数据路径、复杂度、指标或排查工具,而不是只复述定义。
“同一个对象中两个 synchronized ”选择锁策略先看什么?
先看冲突概率、临界区长度、是否允许重试、重试是否幂等,以及业务更看重吞吐还是公平性。冲突低可以偏向乐观策略,冲突高或强一致临界区通常要更明确地排队或阻塞。