synchronized 中怎么避免死锁
在 java 中使用 synchronized 时,避免死锁最直接且有效的方法是确保所有线程获取锁的顺序完全一致。只要规定了全局唯一的锁获取顺序(例如按对象哈希码或固定枚举值排序),就能从逻辑上打破“循环等待”条件,从而彻底消除死锁风险。

如何强制统一锁的获取顺序
实现上述策略的具体做法是:在尝试获取多个锁之前,先比较这些锁对象的引用或标识,按照预定的规则(如升序)对它们进行排序,然后严格按排序后的列表依次调用 synchronized 块。这样做能确保无论哪个线程执行该段代码,其持有的锁链条方向都是一致的,不会出现 A 等 B、B 等 A 的情况。

public class SafeLockOrder {
private final Object lockA = new Object();
private final Object lockB = new Object();
public void safeOperation() {
// 1. 确定锁的顺序
Object first, second;
if (System.identityHashCode(lockA) < System.identityHashCode(lockB)) {
first = lockA;
second = lockB;
} else {
first = lockB;
second = lockA;
}
// 2. 按顺序加锁
synchronized (first) {
synchronized (second) {
doWork();
}
}
}
private void doWork() {
System.out.println("Work done safely");
}
}基于程序中某个输入、条件或结果的具体问题
在上述代码中,如果 lockA 和 lockB 是同一个对象实例,程序会正常执行吗?答案是肯定的。当两个变量指向同一对象时,排序逻辑依然成立,内层 synchronized 实际上是对同一把锁的重复获取。Java 的 synchronized 支持重入,因此不会发生死锁,但外层锁已经持有,内层锁获取是瞬间完成的,不会产生额外的阻塞开销。
立即学习“Java免费学习笔记(深入)”;


















