Reborn's Blog

Synchronized的实现原理和JVM优化

2019-09-04·Java, Concurrency, Synchronized, JVM

使用方式

  1. 普通方法加锁:给当前实例加锁
  2. 静态方法加锁:给当前类的 Class 对象加锁
  3. 同步代码块

实现原理

同步代码块使用 monitor 实现:开始处插入 monitorenter 指令,结束处插入 monitorexit 指令。

修饰方法时,在方法的 access_flags 字段做同步标记。

JVM 优化

JDK 6 以前,synchronized 是重量级锁(调用系统 mutex 锁,涉及用户态/内核态切换)。

JDK 6 以后的优化措施:

锁升级过程

无锁 → 偏向锁 → 轻量级锁 → 重量级锁
  1. 偏向锁:同一线程获取锁时,无需同步操作
  2. 轻量级锁:多线程交替执行时,通过 CAS 自旋获取锁
  3. 重量级锁:多线程竞争激烈时,升级为重量级锁

其他优化

  • 自旋锁:线程不立即挂起,而是循环等待
  • 锁消除:JIT 编译时消除不可能存在竞争的锁
  • 锁粗化:将多个相邻同步块合并为一个

锁状态信息存储在 Java 对象头的 mark word 字段中。

#Java#Concurrency#Synchronized#JVM