【Java面试】用架构师思维带你理解,关于Synchronized锁升级的原理

作者: 跟着Mic学架构分类: 野生技能协会 发布时间: 2022-05-17 17:21:06 浏览:9947 次

【Java面试】用架构师思维带你理解,关于Synchronized锁升级的原理

吃菠菜的太守:
synchronized说起来几个小时讲不完,而且很多人说的都是错的,目前网络上的很多解析,甚至c++源码解析的结论都有问题。首先你得固定jdk版本,不然很多分析都对不上的。单一个偏向锁就能说很久,设计也非常复杂,你得考虑不同锁状态下计算hashcode导致的变化,还引入重偏向和批量撤销辅助效率,好在jdk15就默认禁用了。要想真捋清锁的膨胀各个环节,准备至少花一个礼拜看源码吧[思考]

【回复】回复 @leabug : 主要是这时长不够啊....
二狗子小王:
在JDK早期,synchronized 叫做重量级锁, 因为加锁和解锁都必须通过操作系统的内核。在JDK1.6中,为了减少获取锁和释放锁带来的性能开销,对synchronized进行了锁升级,引入了偏向锁、轻量级锁的概念。因此锁状态一共变成了四种:无锁、偏向锁、轻量级锁和重量级锁。 在了解sync锁的实现原理之前,我们需要知道它到底锁的是什么?我们在使用sync锁的时候会存入一个对象,那么肯定是和这个对象有关的,所以我们需要先了解一下对象的内存布局。 对象在内存中的布局可以分为三部分,分别是:对象头、实例数据和对齐填充。对象头的大小是固定的,占12个字节。对象头由mark word和klass pointer两部分组成。mark word占8个字节,64个bit,它里面存储着对象的HashCode、分代年龄、锁标记位等信息。klass Pointer,即类型指针,占用4个字节,32个bit,它指向类的元数据,虚拟机通过这个指针来确定这个对象是哪个类的实例。而实例数据就是对象中的数据。根据类型的不同占不同的字节,例如boolean类型占1个字节,int类型占4个字节。64位的虚拟机要求对象的大小必须为8的倍数。而对其填充,主要是为了补齐对象头和实例数据占用内存之后剩余的空间大小,如果对象头和实例数据已经占满了JVM所分配的内存空间,那么就不用再进行对齐填充了。 所以通过对象的内存布局,我们就知道了Sync锁的是对象头中的mark word。

【回复】回复 @二狗子小王 : 大佬 有没有简化版的 找实习能用的那种

计算机 java Spring Java开发 Java进阶 java架构 java架构师 技能提升营

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

更多相关阅读