Java语法基础中synchronized关键字的用法

Java语法基础中synchronized关键字的用法
最新回答
拥欲

2026-03-16 00:43:59

synchronized关键字是Java中实现线程同步的基础机制,用于保证同一时刻仅一个线程能执行特定代码块或方法,防止数据竞争并确保内存可见性。其核心用法分为三种场景,底层基于监视器(Monitor)机制实现,并通过锁优化提升性能。

1. 修饰实例方法:锁当前对象(this)
  • 作用范围:当synchronized修饰实例方法时,锁对象为当前实例(this)。多线程访问同一对象的该方法时,会串行执行。
  • 适用场景:需保护对象内部状态,且多个线程仅操作同一实例的场景。
  • 示例:public class Counter { private int count = 0; public synchronized void increment() { count++; // 线程安全,避免并发修改 }}

    不同线程调用同一Counter实例的increment()时,会互斥执行,确保count++的原子性。

2. 修饰静态方法:锁类的Class对象
  • 作用范围:静态方法属于类,synchronized修饰静态方法时,锁对象为类的Class对象(如Counter.class)。所有实例共用此锁。
  • 适用场景:需保护类级别的共享资源(如静态变量),或跨实例同步的场景。
  • 示例:public class Counter { private static int total = 0; public static synchronized void addTotal() { total++; // 所有实例调用此方法时同步执行 }}

    即使操作不同Counter实例,调用addTotal()也会同步,因锁的是类级别的Class对象。

3. synchronized代码块:指定任意锁对象
  • 作用范围:通过synchronized(锁对象)定义临界区,可指定任意共享对象作为锁(如私有对象、this、类名等),粒度更细,性能更优。
  • 适用场景:仅需保护部分代码段,或需灵活控制锁对象的场景。
  • 示例:public class Counter { private int count = 0; private final Object lock = new Object(); // 专用锁对象 public void increment() { synchronized (lock) { count++; // 仅此代码块同步 } }}

    锁对象选择:

    synchronized(this):锁当前实例,与修饰实例方法等效。

    synchronized(Counter.class):锁类,与修饰静态方法等效。

    synchronized(obj):锁任意共享对象,需确保对象生命周期覆盖同步需求。

底层原理:监视器(Monitor)机制
  • 锁获取与释放:每个Java对象关联一个监视器,线程进入同步代码块时需获取锁,执行完后自动释放。若锁被占用,线程阻塞等待。
  • 锁优化(Java 6+):

    偏向锁:无竞争时偏向第一个获取锁的线程,减少性能开销。

    轻量级锁:竞争不激烈时通过CAS操作避免线程阻塞。

    重量级锁:高竞争时退化为操作系统级互斥锁,确保线程安全。

使用注意事项
  • 锁对象选择:

    避免锁对象为null(会抛出NullPointerException)。

    防止锁对象被外部代码修改(如使用public字段作为锁可能导致意外竞争)。

  • 互斥范围:确保同步代码块覆盖所有共享资源访问,避免遗漏导致数据竞争。
  • 性能权衡:同步会引入性能开销,需合理控制锁粒度(如优先使用代码块而非整个方法)。
  • 死锁风险:避免嵌套获取多个锁(如线程A持锁1请求锁2,同时线程B持锁2请求锁1)。
与ReentrantLock的对比
  • 优势:

    简洁性:无需手动释放锁(自动释放),减少编码错误。

    可重入性:同一线程可重复获取已持有的锁。

  • 局限性:

    灵活性不足:无法实现公平锁、尝试获取锁(tryLock)、超时获取锁等高级功能。

    不可中断:线程阻塞时无法响应中断(需配合ReentrantLock的lockInterruptibly())。

总结:synchronized是Java线程同步的基础工具,通过修饰实例方法、静态方法或代码块,可覆盖大多数线程安全场景。其底层基于监视器机制,并通过锁优化提升性能。使用时需注意锁对象选择、互斥范围及性能影响,在简单场景下仍是首选同步手段。