Synchronized的实现原理和JVM优化
2019-09-04·Java, Concurrency, Synchronized, JVM
使用方式
- 普通方法加锁:给当前实例加锁
- 静态方法加锁:给当前类的 Class 对象加锁
- 同步代码块
实现原理
同步代码块使用 monitor 实现:开始处插入 monitorenter 指令,结束处插入 monitorexit 指令。
修饰方法时,在方法的 access_flags 字段做同步标记。
JVM 优化
JDK 6 以前,synchronized 是重量级锁(调用系统 mutex 锁,涉及用户态/内核态切换)。
JDK 6 以后的优化措施:
锁升级过程
无锁 → 偏向锁 → 轻量级锁 → 重量级锁
- 偏向锁:同一线程获取锁时,无需同步操作
- 轻量级锁:多线程交替执行时,通过 CAS 自旋获取锁
- 重量级锁:多线程竞争激烈时,升级为重量级锁
其他优化
- 自旋锁:线程不立即挂起,而是循环等待
- 锁消除:JIT 编译时消除不可能存在竞争的锁
- 锁粗化:将多个相邻同步块合并为一个
锁状态信息存储在 Java 对象头的 mark word 字段中。
#Java#Concurrency#Synchronized#JVM