特性
- 互斥性
- 阻塞性
- 可重入性
- 非公平锁 (不遵循先来先服务的原则)
- 不可中断锁
实现
两种都依赖 对象监视器 monitor
- 基于 C++ ObjectMonitor
- 每个 Java 对象都内置一个 ObjectMonitor 对象
同步代码块
public class SynchronizedDemo {
public void method() {
synchronized (this) {
System.out.println("synchronized 代码块");
}
}
}monitorenter指令指向同步代码块的开始位置monitorexit指令指向同步代码块的结束位置
同步方法块
public class SynchronizedDemo2 {
public synchronized void method() {
System.out.println("锁实例对象");
}
public static synchronized void method2() {
System.out.println("锁类对象");
}
}ACC_SYNCHRONIZEDmethod 上的一个 flag (类元数据→方法区→运行时常量池)
偏向锁
JDK15默认关闭, JDK18废除
- 性能收益不明显
- JVM 内部代码维护成本高
synchronized 可重入怎么实现的
todo 对象头的Markword信息中记录了线程ID, 每次 Monitor 的 recursions+1
锁升级

锁优化
- 自旋锁
- 适应性自旋锁
- 锁消除
- 锁粗化