栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java synchronized锁的状态

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java synchronized锁的状态

我们知道synchronized能够在线程中进行加锁,不过这个加锁的方式分为不同的状态:无锁、偏向锁、轻量级锁和重量级锁。如果在使用时对当前锁的状态不满意,还可以对锁的状态进一步的升级。下面我们就具体synchronized的四种状态进行分析,同时看看锁的状态之间时怎么转化的。

1.无锁状态

在锁对象刚刚new出来的时候,是无锁状态,比如

Object o = new Object();

2.偏向锁

线程1获取锁对象时,会在java对象头和栈帧中记录偏向的锁的threadID

线程1获取该锁时,比较threadID是否一致 ------- 一致 -> 直接进入而无需使用CAS来加锁、解锁

线程2获取该锁时,比较threadID是否一致 ------- 不一致 -> 检查对象的threadID线程是否还存活

存活:代表该对象被多个线程竞争,于是升级成轻量级锁

不存活:将锁重置为无锁状态,锁头重新标记线程2为新的threadID

(如果线程1和线程2的执行时间刚好错开,那么锁只会在偏向锁之间切换而不会升级为轻量级锁,在使用synchronized的情况下避开了获取锁的成本,所以效率和无锁状态非常接近)

3.轻量级锁

对象被多个线程竞争时,锁由偏向锁升级为轻量级锁,轻量级锁采用自旋+CAS方式不断获取锁。

4.重量级锁

当线程的自旋次数过长依旧没获取到锁,为避免CPU无端耗费,锁由轻量级锁升级为重量级锁。

获取锁的同时会阻塞其他正在竞争该锁的线程,依赖对象内部的监视器(monitor)实现,monitor又依赖操作系统底层,需要从用户态切换到内核态,成本非常高。

拓展:偏向锁、轻量级锁、重量级锁之间转换

以上就是java中synchronized锁的四种状态,相信大家已经初步这这几种状态有所了解,在使用synchronized的时候,可以对锁的状态进行灵活调整了。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/15189.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号