synchronized锁升级理解
时间: 2025-08-20 19:56:50 浏览: 2
在 Java 中,`synchronized` 是一种基于对象监视器(Monitor)实现的同步机制,它在 JVM 层面提供了线程同步的能力。为了提高性能,JVM 对 `synchronized` 进行了优化,引入了锁升级机制。该机制通过根据线程竞争情况动态调整锁的状态,从而减少线程阻塞带来的性能开销。
### 锁的类型
Java 中 `synchronized` 的锁可以分为以下几种状态,按照锁的粒度从小到大依次为:
- **无锁状态**:对象未被任何线程锁定。
- **偏向锁**:适用于只有一个线程访问同步块或方法的场景。JVM 会将锁偏向于第一个获取它的线程,后续该线程再次进入同步代码块时,不需要进行同步操作。
- **轻量级锁**:当多个线程交替访问同步资源时,JVM 使用轻量级锁避免线程阻塞,采用自旋的方式尝试获取锁。
- **重量级锁**:当多个线程同时竞争锁,轻量级锁自旋失败达到一定次数(称为自旋锁阈值)后,锁会膨胀为重量级锁,线程进入阻塞状态,等待锁释放。
### 锁升级的过程
锁升级是单向的,即只能从偏向锁 → 轻量级锁 → 重量级锁,不能降级。其过程如下:
1. **偏向锁阶段**:当一个线程访问同步代码块并获取锁时,JVM 会将对象头中的 Mark Word 设置为偏向模式,并记录线程 ID。后续该线程再次进入时,无需加锁操作,直接执行代码[^1]。
2. **轻量级锁阶段**:当另一个线程尝试获取已经被偏向的锁时,偏向锁失效,锁升级为轻量级锁。此时线程会尝试通过 CAS(Compare and Swap)操作将对象头指向自己的锁记录(Lock Record),如果成功则获得锁,否则进入自旋等待。
3. **重量级锁阶段**:如果自旋次数超过一定阈值(通常由 JVM 内部机制决定),或者等待线程数较多,轻量级锁将升级为重量级锁。此时线程会被挂起并进入阻塞状态,直到锁被释放,其他线程才能竞争获取锁[^4]。
### 锁升级的意义
锁升级机制的核心目标是减少线程竞争带来的性能损耗。具体体现在以下方面:
- **偏向锁**:减少无竞争情况下的同步开销,适用于单线程访问同步块的场景。
- **轻量级锁**:避免线程切换的开销,适用于多个线程交替执行同步代码的情况。
- **重量级锁**:处理线程竞争激烈的场景,虽然会带来线程阻塞,但能有效管理资源竞争,避免过多的 CPU 自旋消耗。
### 示例代码
以下是一个简单的使用 `synchronized` 的示例,展示了其在代码块中的使用方式:
```java
public class SynchronizedExample {
private final Object lock = new Object();
public void performTask() {
synchronized (lock) {
// 同步代码块
System.out.println("Thread " + Thread.currentThread().getName() + " is executing synchronized block.");
}
}
}
```
### 总结
`synchronized` 的锁升级机制是 JVM 为了提升并发性能而引入的一项优化策略。通过动态调整锁的状态,JVM 能够根据线程竞争情况选择最合适的锁策略,从而在保证线程安全的同时,尽可能减少性能损耗。这一机制在现代 Java 版本中已经得到了显著优化,使其在大多数场景下都能提供良好的性能表现[^2]。
---
阅读全文
相关推荐


















