synchronized关键字(二)锁的升级过程

本文介绍了Java中synchronized锁的四种状态:无锁、偏向锁、轻量级锁(自旋锁)和重量级锁,详细阐述了锁的升级过程,强调了锁升级不可逆但偏向锁可被重置,以及不同锁对线程的影响。
摘要由CSDN通过智能技术生成

系列文章目录

synchronized关键字(一)修饰对象



参考文献:
https://blog.csdn.net/weixin_42351206/article/details/122199371
https://blog.csdn.net/weixin_45794641/article/details/123255683

前言

在jdk1.5之前,synchronized确实是重量级锁,之后,它便没这么“重”了。synchronized的锁有4种状态:无锁状态、偏向锁状态、自旋锁状态(轻量级锁状态)、重量级锁状态。锁可以升级,但不能降级,但是偏向锁可以被重置成无锁状态。

一、偏向锁

线程大多时候是不存在锁竞争的,常常是一个线程多次获得同一个锁,因此如果每次都要竞争锁会增大很多没有必要的代价,为了降低获取锁的代价,才引入的偏向锁。引入偏向锁的目的:为了在无多线程竞争的情况下尽量的减少不必要的轻量级锁执行路线。

如果在运行过程中,同步锁只有一个线程访问,不存在多线程争用的情况,则线程是不需要触发同步的,这种情况下,就会给线程加一个偏向锁。

1. 偏向锁的原理和升级的过程

关于锁的原理及升级过程的详细信息:synchronized的锁升级过程

2. 偏向锁的释放

偏向锁只有遇到其他线程尝试竞争偏向锁时,持有偏向锁的线程才会释放锁,线程不会主动去释放偏向锁。偏向锁的撤销,需要等待全局安全点(在这个时间点上没有字节码正在执行),它会首先暂停拥有偏向锁的线程,判断锁对象是否处于被锁定状态,撤销偏向锁后恢复到未锁定轻量级锁(的状态

二、自旋锁(轻量级锁)

​ 在偏向锁的基础上,如果在运行过程中,遇到其他线程抢占锁,则持有偏向锁的线程会被挂起JVM会消除它身上的偏向锁,将锁升级到自旋锁(轻量级锁)。

自旋锁(轻量级锁)不会阻塞线程,但会造成CPU的消耗。

1. 自旋锁(轻量级锁)的原理和升级的过程

关于锁的原理及升级过程的详细信息:synchronized的锁升级过程

三、重量级锁

当线程没有获得轻量级锁时,线程会CAS自旋来获取锁,当一个线程自旋10次之后,仍然未获得锁,那么就会升级成为重量级锁。

重量级锁会阻塞线程,线程不再竞争锁,而是由CPU进行调度,线程串行执行。

1. 重量级锁的原理和升级的过程

关于锁的原理及升级过程的详细信息:synchronized的锁升级过程

synchronizedJava中的关键字,用于实现线程同步,保证多个线程访问共享资源时的互斥和可见性。synchronized升级过程是指在Java虚拟机中,synchronized在不同情况下使用的的类型会发生变化,从无锁状态到偏向锁、再到轻量级、最后到重量级,这个过程被称为升级。 具体来说,升级过程如下: 1. 无锁状态:当没有线程竞争同步资源时,处于无锁状态,线程可以自由地进入和退出同步块,不需要任何同步机制。 2. 偏向锁状态:当只有一个线程访问同步资源时,此时该线程会尝试获取偏向锁,如果获取成功,则标记该线程ID,并将对象头的标志位设置为偏向锁。此时,该线程再次进入同步块时,无需进行同步操作,直接进入即可,从而提高了性能。 3. 轻量级状态:当存在多个线程竞争同步资源时,此时偏向锁失效,线程会尝试使用CAS(Compare and Swap)操作将对象头中的标志位由偏向锁转换为轻量级,如果转换成功,当前线程会将对象头复制一份到线程栈的记录中,并在对象头中存储指向线程栈中记录的指针。此时,其他线程访问同步资源时,需要通过自旋等待轻量级的释放,以获取该。 4. 重量级状态:当自旋等待超过一定次数或者线程数超过一定阈值时,会从轻量级状态升级为重量级状态,此时获取该的线程会被挂起,等待被释放后再次竞争。 总的来说,升级过程是为了在不同的场景下使用不同的来提高性能和效率,但需要注意的是,升级过程会带来额外的开销,因此需要根据具体场景进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值