synchronized锁升级的原理
时间: 2023-04-21 11:03:20 浏览: 143
synchronized锁升级是指当多个线程同时请求锁时,虚拟机将请求锁的线程从忙等状态转换为阻塞状态,以减少线程上下文切换带来的性能开销。当锁被释放时,虚拟机会从阻塞队列中选择一个线程获得锁,并将其从阻塞状态转换为忙等状态。这样可以减少线程上下文切换带来的性能开销,提高系统整体的吞吐量。
相关问题
synchronized锁升级原理
好的,关于synchronized锁升级原理,简单说一下:在JDK6之前,synchronized所获得的锁都是重量级锁,会导致性能瓶颈。但是从JDK6开始,JVM实现了一种叫做“偏向锁”的优化机制,即让同步代码块的第一个获取锁的线程默认为将来要继续获取该锁的线程。这种机制可以优化没有竞争的情况下的锁的性能。如果有竞争,偏向锁就会被撤销,升级为轻量级锁;如果轻量级锁竞争失败,则升级为重量级锁。这是对synchronized锁的优化。那么,还有什么问题需要我回答吗?
synchronized 锁升级的原理和代码
`synchronized` 是 Java 中用于实现线程间互斥的一种同步机制。它的底层依赖于 JVM 提供的支持,涉及到对象头、Monitor(监视器)、锁等概念。随着 JDK 版本的发展,JDK 6 及之后引入了锁优化技术,包括偏向锁、轻量级锁和重量级锁的概念,这些共同构成了所谓的 **锁升级** 过程。
---
### synchronized 锁的基本原理
当一个方法或代码块被 `synchronized` 关键字修饰时,意味着只有单一线程能够访问临界区内的代码段。具体来说:
1. 每个 Java 对象都有一个内置的 Monitor(监视器),位于对象的对象头中。
2. 线程在进入同步代码之前需要先获取对应的 Monitor。
3. 如果此时已有其他线程持有该 Monitor,则当前线程会被阻塞,直到前一持有者释放掉它为止。
---
### synchronized 锁升级的过程
#### (1)无锁 -> 偏向锁
- **偏向锁的核心思想**: 在系统启动初期假定不会有多个线程同时竞争某个资源,在这种情况下直接把锁赋予首次访问它的那个特定线程,并记录相关信息到对象头上。以后只要还是同一个线程再来请求这个锁就不需再做额外判断而是快速通行。
- 若发生新的线程介入导致原有假设失效,则撤销偏向状态转而采用下面的形式处理。
```java
// 示例:创建一个简单的测试类展示偏向锁的效果
public class SynchronizedTest {
private int count = 0;
public static void main(String[] args) throws InterruptedException {
SynchronizedTest testInstance = new SynchronizedTest();
// 单线程环境下运行此函数应该触发偏向锁的行为
Thread threadA = new Thread(() -> { for(int i=0;i<1_000_000;i++)testInstance.increment(); });
threadA.start();
threadA.join();
System.out.println("Final Count Value:"+testInstance.getCount());
}
public synchronized void increment(){
this.count++;
}
public int getCount(){return count;}
}
```
以上例子展示了仅有一个工作线程执行同步任务的情形,默认期望会启用偏向锁特性来加速操作流程减少不必要的开销。
#### (2)偏向锁 -> 轻量级锁
- 当检测到有第二个线程尝试获取相同的锁实例的时候,原来那种简单粗暴地一直给予同一条路径直通的权利显然不再合理于是取消先前设定好的偏向标记重新评估状况。
- 此刻便会进入到所谓"spin lock"(自旋转锁)即轻量级别锁定范畴内进行后续争夺战况模拟演练直至决出胜者取得最终所有权方可成功入座继续完成剩下未尽事宜。
示意图表示如下所示:

注意这里的图只是示意性的描述实际内部细节远比图画复杂得多。
#### (3)轻量级锁 -> 重量级锁
最后一步也是最坏的情况便是经过若干轮次徒劳的努力始终未能达成协议只好退守至OS层面上依靠传统的方式如pthread_mutex_lock之类的手段来进行彻底封锁隔离保证数据一致性不受破坏。
以下是简化版伪码解释全过程大致走向趋势:
```pseudo-code
if (current_thread == owner){
return true; // Already owns the bias lock.
} else if(compareAndSwapMarkWord(original_markword,new_value)){
setOwnerToCurrentThread();
updateLogStamp(stamp);
return true;// Successfully acquired biased locking.
}else{
revokeBias();// Revert back to normal state when contention happens.
acquireLightWeightLock(objectRef);
...// Try spin first before escalating further up chain hierarchy.
escalateToHeavyweightModeIfNeeded();
......
}
```
上述内容仅为高层次逻辑架构并不代表真实源码结构布局组织形式仅供参考学习之用不具备任何法律效力约束作用。
---
###
阅读全文
相关推荐
















