2026-03-16 00:43:59
synchronized关键字是Java中实现线程同步的基础机制,用于保证同一时刻仅一个线程能执行特定代码块或方法,防止数据竞争并确保内存可见性。其核心用法分为三种场景,底层基于监视器(Monitor)机制实现,并通过锁优化提升性能。
1. 修饰实例方法:锁当前对象(this)不同线程调用同一Counter实例的increment()时,会互斥执行,确保count++的原子性。
即使操作不同Counter实例,调用addTotal()也会同步,因锁的是类级别的Class对象。
锁对象选择:
synchronized(this):锁当前实例,与修饰实例方法等效。
synchronized(Counter.class):锁类,与修饰静态方法等效。
synchronized(obj):锁任意共享对象,需确保对象生命周期覆盖同步需求。
偏向锁:无竞争时偏向第一个获取锁的线程,减少性能开销。
轻量级锁:竞争不激烈时通过CAS操作避免线程阻塞。
重量级锁:高竞争时退化为操作系统级互斥锁,确保线程安全。
避免锁对象为null(会抛出NullPointerException)。
防止锁对象被外部代码修改(如使用public字段作为锁可能导致意外竞争)。
简洁性:无需手动释放锁(自动释放),减少编码错误。
可重入性:同一线程可重复获取已持有的锁。
灵活性不足:无法实现公平锁、尝试获取锁(tryLock)、超时获取锁等高级功能。
不可中断:线程阻塞时无法响应中断(需配合ReentrantLock的lockInterruptibly())。
总结:synchronized是Java线程同步的基础工具,通过修饰实例方法、静态方法或代码块,可覆盖大多数线程安全场景。其底层基于监视器机制,并通过锁优化提升性能。使用时需注意锁对象选择、互斥范围及性能影响,在简单场景下仍是首选同步手段。