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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 平行线的画法有几种_过直线外一点画平行线的画法

    平行线的画法有几种_过直线外一点画平行线的画法篇一:平行线的画法平行线怎么画平行线的画法平行线怎么画平行线的画法平行线怎么画平行线的画法平行线怎么画平行线的画法平行线怎么画平行线的画法平行线怎么画平行线的画法平行线怎么画平行线的画法平行线怎么画平行线的画法平行线怎么画平行线的画法平行线怎么画平行线的画法篇二:平行线和它的画法9.2平行线和它的画法一、教与学目标:1.学生在自主探究活动中,理解在同一平面内两条直线…

  • pycharm 修改镜像源_linux镜像源哪个好

    pycharm 修改镜像源_linux镜像源哪个好镜像网站是将一个完全相同的站点放到几个服务器,分别有自己的URL,在这些服务器上互为镜像网站。它和主站并没有太大差别,或者可算是为主站作的后备措施。有了镜像网站的好处是:如果不能对主站作正常访问(如某个服务器死掉或出了意外),但仍能通过其它服务器正常浏览。相对来说主站在速度等各方面比镜像站点略胜一筹。

  • NumPy 文件存取 tofile,fromfile, load,save

    NumPy 文件存取 tofile,fromfile, load,save

  • Matlab中弧度转角度、角度转弧度

    Matlab中弧度转角度、角度转弧度Content弧度转角度角度转弧度弧度转角度rad2deg()函数可以用于将弧度转为角度示例:角度转弧度deg2rad()函数可以用于将角度转换为弧度。示例:

  • 渗透测试工具包 | 开源安全测试工具 | 网络安全工具

    渗透测试工具包 | 开源安全测试工具 | 网络安全工具项目介绍记录渗透测试开源工具。自动化渗透测试 AttackSurfaceMapper-自动化渗透测试工具,使用手册/测试流程。 vajra-自动化渗透测试. Savior-渗透测试报告自动生成工具!. 漏洞利用框架 hackUtils-它是一个用于渗透测试和网络安全研究的黑客工具包,渗透以及web攻击脚本。 msf框架: pocsscan攻击框架 Pocsuite攻击框架 Beebeeto攻击框架 …

  • 联想笔记本键盘亮屏幕不亮_笔记本电脑进入睡眠状态后无法通过鼠标或键盘来唤醒屏幕怎么解决…「建议收藏」

    联想笔记本键盘亮屏幕不亮_笔记本电脑进入睡眠状态后无法通过鼠标或键盘来唤醒屏幕怎么解决…「建议收藏」‍通常情况下,我们如果有一段时间没有使用笔记本电脑,那么笔记本会自动进入睡眠状态。有用户发现笔记本电脑进入睡眠状态后无法通过鼠标或键盘来唤醒屏幕,那么应该怎么解决这个问题呢?大家可以参考下面提供的方法看看能否解决。1、如果遇到睡眠不能唤醒的问题,可以点击笔记本上的电源按钮,有的机型是通过点击电源按钮来唤醒的;2、如果点开机键还是不能解决,可以查看硬盘指示灯,在睡眠状态下,硬盘灯是闪烁的;3、如果硬…

发表回复

您的电子邮箱地址不会被公开。

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