synchronized锁升级过程?
时间: 2025-05-22 13:45:50 浏览: 17
### Java 中 synchronized 锁的升级机制及过程
#### 偏向锁 (Biased Locking)
当一个线程访问同步块并获取锁时,JVM会标记此对象为偏向该线程的对象。如果后续由同一个线程再次访问这个同步块,则无需重新加锁和解锁操作,只需简单地验证当前线程是否仍然拥有偏向锁即可[^1]。这种机制减少了频繁进入退出同步块所带来的性能开销。
#### 轻量级锁 (Lightweight Locking)
一旦有第二个线程尝试访问被第一个线程持有的锁时,就会触发轻量级锁模式。在此阶段,JVM不会立即将锁降级为重量级锁;而是采用一种称为自旋的方式让后来的竞争者循环等待直到原持有者释放锁为止[^2]。这种方式适用于那些锁定时间很短的情况,因为避免了操作系统层面昂贵的上下文切换成本。
#### 自旋锁 (Spin Lock)
作为轻量级锁的一部分,自旋锁是一种忙等待技术,即在一定次数内不断重试以期获得所需的资源而不停留在队列里排队等候调度器安排执行机会[^3]。对于大多数应用来说,默认情况下只有短暂时间段内的争用才会启用自旋策略,超过设定阈值则转为传统阻塞方式处理请求。
#### 重量级锁 (Heavyweight Locking)
最终,在高并发环境下或者长时间占用锁的情况下,synchronized 将退化成基于操作系统互斥量(mutex lock)实现的传统重量级锁形式。此时涉及到用户态与核心态之间的转换以及可能伴随而来的时间片分配等问题,因此其代价相对较高[^4]。
综上所述,`synchronized` 的锁升级路径大致遵循如下顺序:**偏向锁 -> 轻量级锁(含自旋锁) -> 重量级锁**。每一步骤都旨在适应特定条件下的最优解决方案,从而达到既保障数据一致性又兼顾效率的目的。
```java
public class SynchronizationExample {
private final Object monitor = new Object();
public void methodA() {
synchronized(monitor){
System.out.println("Executing Method A");
}
}
public static void main(String[] args) throws InterruptedException{
SynchronizationExample example=new SynchronizationExample();
Thread t1= new Thread(()->{example.methodA();});
Thread t2= new Thread(()->{example.methodA();});
t1.start();t2.start();
t1.join();t2.join();
}
}
```
上面展示了一个简单的例子来演示两个线程如何竞争同一把监视器上的锁,并经历潜在的不同类型的锁状态变化。
阅读全文
相关推荐
















