synchronized通过加锁实现线程同步:同步实例方法锁this,同步静态方法锁Class对象,同步代码块可自定义锁对象;它是可重入锁,但不支持中断、超时和公平性。

在 Java 中,synchronized 关键字用于保证同一时刻只有一个线程能执行某个方法或代码块,从而避免多线程并发访问导致的数据不一致问题。它通过加锁机制实现同步,锁的对象决定了同步的粒度和范围。
同步实例方法:锁的是当前对象(this)
当 synchronized 修饰普通成员方法时,JVM 会自动以调用该方法的对象(即 this)作为锁。不同对象调用同一同步方法互不影响;但同一个对象的多个同步方法之间会相互阻塞。
- 写法示例:
public synchronized void withdraw(double amount) { ... } - 等价于:
public void withdraw(double amount) { synchronized(this) { ... } } - 适用场景:操作共享的实例变量(如账户余额、计数器等)
同步静态方法:锁的是类对象(Class)
静态方法属于类而非实例,因此 synchronized 修饰静态方法时,锁的是该类的 Class 对象(如 Account.class)。所有该类的静态同步方法共用同一把锁,无论多少个实例都受此约束。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 写法示例:
public static synchronized void resetCounter() { ... } - 等价于:
public static void resetCounter() { synchronized(Account.class) { ... } } - 适用场景:操作静态共享资源(如全局计数器、配置缓存等)
同步代码块:灵活指定锁对象
相比同步整个方法,synchronized 代码块更精细——可以只对真正需要保护的临界区加锁,并自由选择锁对象,避免不必要的阻塞。
立即学习“Java免费学习笔记(深入)”;
- 写法示例:
synchronized(lockObject) { balance -= amount; } - 锁对象建议用私有 final 对象(如 private final Object lock = new Object();),避免被外部误用或干扰
- 不要用 String、Integer 等可能被常量池复用的对象作锁,否则不同逻辑可能意外共享同一把锁
注意事项与常见误区
synchronized 是可重入锁,同一线程可多次获取同一把锁;但它不支持中断、超时和公平性控制。使用时需注意:
- 避免嵌套锁顺序不一致,以防死锁(例如 A 先锁 obj1 再锁 obj2,B 反过来)
- 同步范围尽量小,只包裹真正共享数据的操作,减少性能损耗
- 不要在同步方法内调用外部不可控的代码(如回调、I/O),可能延长持锁时间甚至引发死锁
- 若需更高级的并发控制(如尝试获取锁、超时、条件等待),考虑 java.util.concurrent.locks.ReentrantLock

















