java锁升级过程

java锁升级过程java中对象锁有4种状态:(级别从低到高)1.无锁状态2.偏向锁状态3.轻量级锁状态4.重量级锁状态对象头分两部分信息,第一部分用于存储哈希码、GC分代年龄等,这部分数据被称为”MarkWord”。在32位的HotSpot虚拟机中对象未被锁定的状态下,MarkWord的32bit空间中的25bit用于存储对象哈希码,4bit用于存储对象分代年龄,2bit用于存储锁标志位,1bit固…

大家好,又见面了,我是你们的朋友全栈君。

java中对象锁有4种状态:(级别从低到高)
1.无锁状态
2.偏向锁状态
3.轻量级锁状态
4.重量级锁状态

对象头分两部分信息,第一部分用于存储哈希码、GC分代年龄等,这部分数据被称为”Mark Word”。在32位的HotSpot虚拟机中对象未被锁定的状态下,Mark Word的32bit空间中的25bit用于存储对象哈希码,4bit用于存储对象分代年龄,2bit用于存储锁标志位,1bit固定为0,在其他状态(轻量级锁定、重量级锁定、GC标记、可偏向)下对象的存储内容见下表:
在这里插入图片描述
锁升级的方向是:无锁——>偏向锁——>轻量级锁——>重量级锁,并且膨胀方向不可逆。

1.偏向锁
偏向锁是JDK6中引入的一项锁优化,大多数情况下,锁不仅不存在多线程竞争,而且总是由同一线程多次获得,为了让线程获得锁的代价更低而引入了偏向锁。
偏向锁会偏向于第一个获得它的线程,如果在接下来的执行过程中,该锁没有被其他的线程获取,则持有偏向锁的线程将永远不需要同步。

2.轻量级锁
如果明显存在其它线程申请锁,那么偏向锁将很快升级为轻量级锁。

3.自旋锁
自旋锁原理非常简单,如果持有锁的线程能在很短时间内释放锁资源,那么那些等待竞争锁的线程就不需要做内核态和用户态之间的切换进入阻塞挂起状态,它们只需要等一等(自旋),等持有锁的线程释放锁后即可立即获取锁,这样就避免用户线程和内核的切换的消耗。

4.重量级锁
指的是原始的Synchronized的实现,重量级锁的特点:其他线程试图获取锁时,都会被阻塞,只有持有锁的线程释放锁之后才会唤醒这些线程。

锁升级场景:

场景1: 程序不会有锁的竞争。
那么这种情况我们不需要加锁,所以这种情况下对象锁状态为无锁。

场景2: 经常只有某一个线程来加锁。
加锁过程:也许获取锁的经常为同一个线程,这种情况下为了避免加锁造成的性能开销,所以并不会加实际意义上的锁,偏向锁的执行流程如下:
1、线程首先检查该对象头的线程ID是否为当前线程;
2、A:如果对象头的线程ID和当前线程ID一直,则直接执行代码;B:如果不是当前线程ID则使用CAS方式替换对象头中的线程ID,如果使用CAS替换不成功则说明有线程正在执行,存在锁的竞争,这时需要撤销偏向锁,升级为轻量级锁。
3、如果CAS替换成功,则把对象头的线程ID改为自己的线程ID,然后执行代码。
4、执行代码完成之后释放锁,把对象头的线程ID修改为空。

场景3: 有线程来参与锁的竞争,但是获取锁的冲突时间很短。
当开始有锁的冲突了,那么偏向锁就会升级到轻量级锁;线程获取锁出现冲突时,线程必须做出决定是继续在这里等,还是回家等别人打电话通知,而轻量级锁的路基就是采用继续在这里等的方式,当发现有锁冲突,线程首先会使用自旋的方式循环在这里获取锁,因为使用自旋的方式非常消耗CPU,当一定时间内通过自旋的方式无法获取到锁的话,那么锁就开始升级为重量级锁了。

场景4: 有大量的线程参与锁的竞争,冲突性很高。
我们知道当获取锁冲突多,时间越长的时候,我们的线程肯定无法继续在这里死等了,所以只好先休息,然后等前面获取锁的线程释放了锁之后再开启下一轮的锁竞争,而这种形式就是我们的重量级锁。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/161185.html原文链接:https://javaforall.net

(0)
上一篇 2022年7月18日 下午2:36
下一篇 2022年7月18日 下午2:36


相关推荐

  • 整理:数据库设计的六个阶段详解

    整理:数据库设计的六个阶段详解按照规范设计,我们将数据库的设计过程分为六个阶段:1、系统需求分析阶段;2、概念结构设计阶段;3、逻辑结构设计阶段;4、物理结构设计阶段;5、数据库实施阶段;6、数据库运行与维护阶段;每个阶段的详细解析如下:(资料来自:数据库设计(百度文库))一、系统需求分析阶段1、需求分析的任务2、需求分析的两种方法:自顶向下和自底向上二、概念结构设计三、逻辑结构设计

    2025年6月6日
    6
  • VMware卸载辛酸历程

    VMware卸载辛酸历程you 吐槽的就是 vmware 虚拟机的卸载 由于要虚拟机上面安装系统总是中断 只好重新安装 所以要卸载当前这个 vmware 在 windows 中的进程实在是太多了 而且关联的文件也是无比繁杂 就像昨天的 ubuntu windows 自带的软件和 360 根本卸载不了 只好手动删除了 可是它的安装文件在各个目录中 注册文件也分布在注册表的各个角落 每次安装新的虚拟机都提示要先卸载旧的 只好在网上查找各种方案

    2026年3月26日
    2
  • 一文搞定子网划分!子网掩码!超详细例题解析![通俗易懂]

    一文搞定子网划分!子网掩码!超详细例题解析![通俗易懂]子网划分理论基础为什么进行子网划分减少网络流量,无论什么样的流量,我们都希望它少些,网络流量亦如此。如果没有可信赖的路由器,网络流量可能导致整个网络停顿,但有了路由器后,大部分流量都将呆在本地网络内,只有前往其他网络的分组将穿越路由器。路由器增加广播域,广播域越多,每个广播轻松划分子网域就越小,而每个网段的网络流量也越少。优化网络性能,这是减少网络流量的结果。简化管理,与庞大的网络相比,在一系列相连的小网络中找出并隔离网络问题更容易。有助于覆盖大型地理区域,WAN链路比LAN链路的速度慢得多,且

    2022年6月27日
    28
  • 实现图片懒加载(及优化相关)

    工作之余想要休闲一下(看-美-女-图),但是又觉得单纯休闲不利于自身进步,于是……

    2022年4月6日
    45
  • 如何解决Linux 系统下 ifconfig 命令无网络接口 ens33[通俗易懂]

    如何解决Linux 系统下 ifconfig 命令无网络接口 ens33

    2022年3月13日
    438
  • qxdm 激活_腾讯视频怎么激活

    qxdm 激活_腾讯视频怎么激活UserName: ZTEPassword:    walshcodeAdminKey:   1071

    2022年10月2日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号