synchronized的核心优势是可靠、简单、安全:保障原子性、可见性、有序性;自动加解锁无泄漏;内置wait/notify协作机制;锁升级优化性能。

synchronized 在解决多线程逻辑冲突时,核心优势不是“功能最全”,而是在正确场景下足够可靠、足够简单、足够安全。它不靠灵活取胜,而靠 JVM 层面的强保障立住脚跟。
直接保证三大并发问题的根基
它从语言和运行时层面,一次性封住多线程中最常见的三类逻辑冲突源头:
原子性失控(比如
count++被拆成读-改-写三步,中间被其他线程插队)
→synchronized把整段代码变成不可分割的执行单元,线程要么全执行完,要么根本进不来。可见性丢失(一个线程改了变量,另一个线程还在用旧值)
→ 进入锁时强制从主内存重读共享变量;退出锁时强制把修改刷回主内存。JMM 层面直接兜底。指令重排导致的诡异行为(编译器或 CPU 为优化打乱顺序,破坏逻辑依赖)
→ 锁的 acquire/release 构成 happens-before 关系,天然禁止临界区内外的非法重排。
锁行为由 JVM 全权托管,零泄漏风险
没有 lock() 和 unlock() 的配对负担,不会因异常、return 或忘记释放而卡死锁:
- 方法级
synchronized:JVM 在字节码中自动插入ACC_SYNCHRONIZED标志,调用即加锁,返回(含异常)即解锁。 - 同步块
synchronized(obj):字节码含monitorenter/monitorexit指令,即使中途抛异常,JVM 也确保monitorexit执行。
→ 不用写finally,不怕手抖,线程安全不依赖程序员的自律。
天然支持线程协作,不止是“互斥”
它不只是让线程排队,还内置了 wait() / notify() / notifyAll() 机制:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
-
wait()会释放当前持有的锁,并进入该对象的WaitSet; -
notify()唤醒WaitSet中一个等待线程,它被唤醒后需重新竞争锁; - 这种“释放锁 + 等待 + 唤醒 + 重抢锁”的闭环,是实现生产者-消费者、线程池任务调度等经典模型的底层基础。
锁升级优化让性能不拖后腿
JDK 6 起,JVM 对 synchronized 做了深度优化,不再是“一上来就重量级”:
- 无竞争时用偏向锁(只记录线程 ID,几乎零开销);
- 轻度竞争用轻量级锁(CAS 自旋,避免系统态切换);
- 高竞争才升级为重量级锁(真正挂起线程)。
→ 在绝大多数业务场景(如单例获取、计数器增减、配置加载),它的实际开销已和ReentrantLock持平甚至更低。
不复杂但容易忽略

















