锁升级

作者: 夏虫亦可语冰 | 来源:发表于2022-08-29 09:28 被阅读0次

对象元信息

在JVM当中,一个Java对象的内存主要有三块:

对象头,对象头包含两部分数据,分别是Mark word和类型指针(Kclass pointer)。
实例数据,就是我们在类当中定义的各种数据。
对齐填充,JVM在实现的时候要求每一个对象所占有的内存大小都需要是8字节的整数倍,如果一个对象的数据所占有的内存大小不够8字节的整数倍,那就需要进行填充,补齐到8字节,比如说如果一个对象站60字节,那么最终会填充到64字节。

而与我们要谈到的synchronized锁升级原理密切相关的是Mark word,这个字段主要是存储对象运行时的数据,比如说对象的Hashcode、GC的分代年龄、持有锁的线程等等。而Kclass pointer主要是用于指向对象的类,主要是表示这个对象是属于哪一个类,主要是寻找类的元数据。
在32位Java虚拟机当中Mark word有4个字节一共32个比特位,其内容如下:


image.png

我们在使用synchronized时,如果我们是将synchronized用在同步代码块,我们需要一个锁对象。对于这个锁对象来说一开始还没有线程执行到同步代码块时,这个4个字节的内容如上图所示,其中有25个比特用来存储哈希值,4个比特用来存储垃圾回收的分代年龄,剩下三个比特其中第一个用来表示当前的锁状态是否为偏向锁,最后的两个比特表示当前的锁是哪一种状态:

如果最后三个比特是:001,则说明锁状态是没有锁。
如果最后三个比特是:101,则说明锁状态是偏向锁。
如果最后两个比特是:00, 则说明锁状态是轻量级锁。
如果最后两个比特是:10, 则说明锁状态是重量级锁。

无锁->偏向锁->轻量级锁->重量级锁

不加锁->一个线程持有锁->多个线程持有锁(cas)->cas一定次数无法取到锁

相关文章

  • 锁升级

    什么是锁升级?(Lock Escalation) 指将当前锁的粒度降低。比如: 把行锁升级为页锁。 将页锁升级为表...

  • java提高班2-Synchronized 加锁原理

    锁升级过程 无锁 -> 偏向锁 -> 轻量级锁 -> 重量级锁 锁升级原理图 无锁 -> 偏向锁 线程T1请求sy...

  • 多线程中 synchronized 锁升级,偏向锁>轻量级锁>重

    多线程中 synchronized 锁升级的原理是什么? synchronized 锁升级原理:在锁对象的对象头里...

  • 锁的四种状态

    锁的状态总共四种:无锁状态、偏向锁、轻量级锁和重量级锁。随着锁的竞争,锁可以从偏向锁升级到轻量级锁,再升级到重量级...

  • 27、说说什么是锁升级?

    说说什么是锁升级? MySQL 行锁只能加在索引上,如果操作不走索引,就会升级为表锁。因为 InnoDB 的行锁是...

  • 锁升级

    状态转换 未加锁 -> 偏向锁 -> 轻量锁(自旋锁) -> 重量锁 偏向锁 当对象未被加锁,而有加锁请求,那么将...

  • 锁升级

    https://blog.csdn.net/tongdanping/article/details/7964733...

  • 锁升级

    对象元信息 在JVM当中,一个Java对象的内存主要有三块: 对象头,对象头包含两部分数据,分别是Mark wor...

  • JUC框架说明

    synchronized 锁升级:偏向锁 -》轻量级锁 -》重量级锁 1、同步状态的原子性管理 ...

  • 阿里面试失败后,一气之下我图解了Java中18把锁

    乐观锁和悲观锁 独占锁和共享锁 互斥锁和读写锁 公平锁和非公平锁 可重入锁 自旋锁 分段锁 锁升级(无锁|偏向锁|...

网友评论

      本文标题:锁升级

      本文链接:https://www.haomeiwen.com/subject/dnfggrtx.html