synchronized通过强制互斥执行保证原子性——同一时刻仅一个线程可进入被保护代码区,使复合操作不被中断;其基于对象monitor实现,锁对象依修饰方式而定,底层由monitorenter/monitorexit指令保障异常安全的成对加解锁,锁升级不影响原子性语义,且原子性作用于整个同步块而非单条语句。

synchronized 通过强制互斥执行来保证原子性——同一时刻只有一个线程能进入被它保护的代码区域,从而让复合操作(比如 count++)不会被其他线程打断。
靠内置锁实现独占访问
每个 Java 对象都关联一个 Monitor(监视器),synchronized 就是基于这个机制工作的。当线程执行 synchronized 代码块或方法时,必须先获取对应对象的锁:
- 修饰实例方法 → 锁的是 this 对象
- 修饰静态方法 → 锁的是当前类的 Class 对象
- 修饰同步代码块 → 锁的是括号里指定的对象(推荐用私有 final 对象)
没拿到锁的线程会阻塞在 Entry Set 中,直到持有锁的线程退出临界区并释放锁。
底层靠 monitorenter/monitorexit 指令保障不中断
编译后,synchronized 会被翻译成一对字节码指令:
- monitorenter:尝试加锁,失败则挂起线程
- monitorexit:无论正常结束还是抛异常,都会执行(JVM 保证),确保锁一定释放
这种“成对出现 + 异常安全”的设计,让临界区内所有语句天然构成一个不可分割的执行单元。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
锁升级机制不影响原子性语义
从 JDK 6 起,JVM 对锁做了优化,状态会随竞争程度升级:无锁 → 偏向锁 → 轻量级锁 → 重量级锁。但不管处于哪种状态:
- 加锁成功才允许执行临界区代码
- 锁释放前,其他线程无法进入同一把锁保护的区域
- 可重入性允许同一线程重复获取同一把锁,避免自锁死
这些细节对开发者透明,原子性行为始终一致。
原子性只作用于同步块内,不是操作本身
要注意:synchronized 不让 count++ 这个表达式本身变原子,而是让整个 synchronized { count++; } 这段逻辑成为原子单元。也就是说:
- 没加 synchronized 时,
count++实际是“读-改-写”三步,可能被穿插 - 加了之后,这三步被包裹在锁内,其他线程无法介入中间过程
所以它解决的是“多步操作的整体原子性”,而不是单条语句的天然原子性(像 int 赋值那样)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










