synchronized是Java最基础的线程同步机制,通过内置锁(Monitor)保证同一时刻仅一个线程执行被保护代码;实例方法锁this、静态方法锁Class对象、代码块可自定义锁对象;它是可重入锁,自动释放,不支持中断与超时。

synchronized 是 Java 中最基础、最常用的线程同步机制,它通过**内置锁(Intrinsic Lock,也叫 Monitor Lock)**来保证同一时刻只有一个线程可以执行被保护的代码段,从而避免多线程并发访问共享资源时出现数据不一致问题。
同步方法:锁住当前对象或类
在方法声明上加 synchronized,JVM 会自动为该方法加上锁:
- 对实例方法加 synchronized,锁的是当前对象(this);不同对象的同步实例方法可并行执行。
- 对静态方法加 synchronized,锁的是当前类的 Class 对象(如 MyClass.class),所有该类的静态同步方法共用同一把锁。
同步代码块:精准控制锁范围和锁对象
使用 synchronized(锁对象) { ... } 语法,可指定任意非 null 对象作为锁:
- 锁对象可以是 this、某个私有 final 对象(推荐)、Class 对象,甚至是一个专门创建的 Object 实例。
- 相比同步方法,同步代码块能缩小临界区,减少锁竞争,提升并发性能。
- 示例:synchronized(lockObj) { count++; } —— 只有拿到 lockObj 锁的线程才能执行 ++ 操作。
锁的可重入性与释放时机
synchronized 是可重入锁:
立即学习“Java免费学习笔记(深入)”;
- 同一个线程可多次获取同一把锁(比如同步方法内部调用另一个同步方法),不会死锁。
- 锁在方法/代码块执行完毕后自动释放,包括正常结束、抛出异常、return 等所有退出路径。
- 无需手动加锁/解锁,也不会因忘记释放导致死锁(这点比 ReentrantLock 更安全易用)。
底层原理简述
JVM 通过字节码指令 monitorenter 和 monitorexit 来实现 synchronized:
- 进入同步块前执行 monitorenter,尝试获取对象监视器(Monitor);若已被占用,则线程阻塞等待。
- 退出同步块时执行 monitorexit,释放监视器,唤醒等待队列中的线程。
- 每个 Java 对象都关联一个 Monitor,由操作系统互斥量(mutex)和条件变量(condition variable)支撑。


















