synchronized的JVM层面原理?锁升级流程?
时间: 2025-07-13 14:19:19 浏览: 14
### synchronized关键字在JVM层面的原理
`synchronized` 是 Java 中用于实现线程同步的关键字,其底层实现依赖于 JVM 的对象监视器(Monitor)机制。当一个方法或代码块被 `synchronized` 修饰时,JVM 会通过对象头中的 Mark Word 来管理锁的状态。Mark Word 是对象头的一部分,存储了对象的元数据信息,包括锁状态、线程 ID 等[^3]。
在 JDK 1.6 之前,`synchronized` 使用的是重量级锁,这会导致较高的性能开销。为了提高效率,JDK 1.6 引入了锁优化机制,主要包括偏向锁、轻量级锁和重量级锁的升级过程[^2]。
### 锁升级流程
锁升级是 JVM 在运行时根据竞争情况动态调整锁状态的过程。以下是锁升级的具体流程:
#### 1. **无锁状态**
- 初始状态下,对象未被任何线程锁定,Mark Word 中的锁标志位为 00。
- 此时没有线程持有锁,也无需进行任何操作。
#### 2. **偏向锁**
- 当第一个线程访问被 `synchronized` 保护的资源时,JVM 会尝试将锁设置为偏向锁。
- 偏向锁假设在大多数情况下只有一个线程会访问该资源,因此直接将线程 ID 写入 Mark Word 中,避免了频繁的加锁和解锁操作。
- 如果有其他线程尝试访问,则偏向锁会被撤销并升级为轻量级锁。
#### 3. **轻量级锁**
- 轻量级锁适用于多个线程交替执行同步块的情况。
- 在这种模式下,JVM 使用 CAS(Compare And Swap)操作尝试获取锁。如果成功,则当前线程继续执行;否则进入自旋等待,直到锁可用[^3]。
- 如果自旋次数超过一定阈值或锁竞争激烈,则升级为重量级锁。
#### 4. **重量级锁**
- 当锁竞争非常激烈时,JVM 会将轻量级锁升级为重量级锁。
- 在重量级锁状态下,线程进入阻塞状态,由操作系统负责线程调度,这会导致较大的性能开销[^2]。
#### 5. **锁消除与优化**
- JVM 还可以通过逃逸分析等技术,在编译期识别出那些不可能被多个线程共享的锁,并将其消除,从而避免不必要的同步开销[^4]。
### 示例代码
以下是一个使用 `synchronized` 的简单示例,展示了其在代码中的应用:
```java
public class SynchronizedExample {
private int count = 0;
// synchronized 方法
public synchronized void increment() {
count++;
}
// synchronized 代码块
public void decrement() {
synchronized (this) {
count--;
}
}
public int getCount() {
return count;
}
}
```
### 锁的优缺点
- **优点**:
- 简单易用,开发者无需手动管理锁的获取和释放。
- JVM 提供了高效的锁优化机制,能够适应不同的竞争场景[^3]。
- **缺点**:
- 在高并发场景下,重量级锁可能导致严重的性能瓶颈。
- 锁升级过程中可能引入额外的开销,尤其是在偏向锁撤销时[^3]。
阅读全文
相关推荐



















