1. 理解synchronized的本质
在Java并发编程中,synchronized关键字就像十字路口的红绿灯,它通过建立明确的通行规则来避免线程间的碰撞事故。这个关键字从JVM层面实现了互斥锁机制,当多个线程试图访问同一资源时,能够确保同一时刻只有一个线程可以执行临界区代码。
我刚开始接触多线程时,曾天真地认为简单的变量读写不需要同步控制,直到在线上环境遇到诡异的数值错乱问题。那次教训让我明白:所有共享变量的修改操作都必须考虑线程安全。synchronized正是Java提供的最基础的线程安全解决方案。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. synchronized的三种应用方式
2.1 实例方法同步
给普通实例方法加上synchronized修饰时,锁对象就是该方法所属的实例。这相当于给每个对象配备了一把专属门锁:
java复制public class Counter {
private int value;
public synchronized void increment() {
value++; // 这个代码块同一时间只能有一个线程执行
}
}
实际经验:实例方法同步适合保护对象内部状态,但要注意如果存在多个需要同步的方法,它们会共用同一把锁,可能导致不必要的阻塞。
2.2 静态方法同步
当synchronized修饰静态方法时,锁对象变成了类的Class对象。这就像在公司大门加了指纹锁,所有员工(实例)进出都要经过同一套验证:
java复制public class Logger {
private static int logCount;
public static synchronized void log(String message) {
logCount++;
System.out.println(message);
}
}
2.3 同步代码块
最灵活的用法是指定具体的锁对象,可以精确控制同步范围。我经常用这种方式来减小锁的粒度:
java复制public class Cache {
private final Object lock = new
