面时莫慌 | 你好,谈谈对Synchronized的理解?(二)


theme: channing-cyan

紧接着上一篇你好,谈谈对Synchronized的理解?(一),这一篇文章来谈谈实现synchronized的关键锁在哪儿。

三、锁存储布局

synchronized始终与对象关联。如果方法是静态的,那么关联的对象就是类;如果该方法是非静态的,则关联的对象是实例。如果是代码块,那么就是指定的对象。很显然,锁是记录于对象中。那么问题来了,synchronized的锁具体指的是什么呢?简单理解锁就是一个共享的资源,记录了谁占有它,当前状态是什么等等。我们先来分析对象在内存中是如何存储的。

Hotspot JVM 中,Java Object对象在内存中存储中的存储布局分为三个区域,分别是对象头、示例数据、对象填充。如图所示,数组和对象的存储布局十分相似,只是对象的头部大于数组的长度,因为数组需要存储自身的长度,为4Byte。

Java Object.png

从图上可以看出,对象头部包括两部分,分别是对象标记和类元信息(类型指针)。对象标记,也就是Markword存储对象的 hashCodeGC 信息和锁等信息。类元信息存储“类对象信息的指针”。在32位的 JVM中,对象头占用8个byte,另外在64位的 JVM占用16个字节。

markword.png

如上图所示,这个是Markword类在32位的 JVM的各种情况存储布局,Markword 里面存储的数据会随着锁标志位的变为而变化,大致存储的变化共分为五种情况。我们可以从图上看到从无锁->偏向锁->轻量级锁->重量级锁存储的变化过程,这个就是锁升级的过程。

那么问题来了,是不是所有的对象都能实现锁呢?答案是肯定的。

  • 首先我们对于Java有一个共有的认知,那就是所以的对象都派生自Object,每个Object在内存中存储都如我们图上所示的,都有对象头,对象头中有Markword对象标记。 需要注意的是,对象存储包括Markword对象标记的实现都是native的,都是C++语言实现的对象。
  • 线程在获取锁时,实际获取的是一个监视器(monitor)对象,这是一个同步对象,所有的Java Object都包含这个对象。同样的,这个对象也是native的。

篇幅较长,继续阅读请点击你好,谈谈对Synchronized的理解?(三)


哥佬倌,莫慌到走!觉好留个赞,探讨上评论。欢迎关注面试专栏面时莫慌 | Java并发编程,面试加薪不用愁。也欢迎关注我,一定做一个长更的好男人。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值