1. 对象锁失效的典型场景剖析
在Java并发编程实践中,synchronized关键字作为最基础的线程同步手段,其失效问题往往源于对锁机制的理解偏差。以下是五种高频出现的锁失效场景及其背后的原理:
1.1 不同对象实例的锁隔离
java复制public class PaymentService {
public synchronized void processPayment() {
// 支付处理逻辑
}
}
// 多线程调用场景
PaymentService service1 = new PaymentService();
PaymentService service2 = new PaymentService();
new Thread(() -> service1.processPayment()).start();
new Thread(() -> service2.processPayment()).start();
关键点:实例方法上的synchronized锁定的是当前对象实例(this),不同实例的锁相互独立。当需要跨实例同步时,应改用类锁(static synchronized)或显式锁住共享资源。
1.2 字符串字面量锁的陷阱
java复制private final String lock = "LOCK_001";
public void riskyMethod() {
synchronized(lock) {
// 临界区代码
}
}
字符串常量池的特性会导致不同JVM实例、甚至同一JVM内不同类加载器加载的相同字面量共享锁对象。更安全的做法是:
java复制private final Object lock = new Object(); // 显式创建专用锁对象
1.3 锁对象被意外修改
java复制private List<String> lockHolder = new ArrayList<>();
public void unsafeMethod() {
synchronized(lockHolder) {
lockHolder = new A
