广告
返回顶部
首页 > 资讯 > 后端开发 > Python >java锁升级过程过程详解
  • 832
分享到

java锁升级过程过程详解

2024-04-02 19:04:59 832人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录1.说到锁升级的过程,我们就得说一下对象头对象头对象头的存在形式接下来让我们看看锁升级的过程专业版解释我通过马士兵老师讲的带味道的栗子大致懂了这个过程(菜鸟版理解)总结1.说到锁

1.说到锁升级的过程,我们就得说一下对象头

对象头

java对象保存在内存中,由3个部分组成:

1. 对象头

2. 实例数据

3. 对齐填充字节

4. 如果是数组还包含数组长度

对象头的存在形式

让我们先看看图,主要来说一下 Mark Word

  • markword 8bytes
  • class pointer - 指向对象所属的class (一般是4bytes)
  • instance data - 成员变量
  • padding - 8字节对齐

Mark Word里都有啥

hashcode

GC

为了让你们更好理解我先放一张图

此处,有几点要注意:

  • 如果对象没有重写hashcode方法,那么默认是调用os::random产生hashcode,可以通过System.identityHashCode获取;os::random产生hashcode的规则为:next_rand = (16807seed) mod (2*31-1),因此可以使用31位存储;另外一旦生成了hashcode,JVM会将其记录在markword中;
  • GC年龄采用4位bit存储,最大为15,例如MaxTenuringThreshold参数默认值就是15;
  • 当处于轻量级锁、重量级锁时,记录的对象指针,根据JVM的说明,此时认为指针仍然是64位,最低两位假定为0;当处于偏向锁时,记录的为获得偏向锁的线程指针,该指针也是64位;

这里呢,是讲解的锁升级所以就重点看一下后两位,锁状态的判断就是看后两位的状态,无锁和偏向锁是看倒数第三位的状态

接下来让我们看看锁升级的过程

专业版解释

1、当没有被当做锁的时候,这就是个普通对象,锁标志位为01,是否偏向锁为0

2、当对象被当做同步锁时,一个线程A抢到锁时,锁标志位依然是01,是否偏向锁为1,前23位记录A线程的线程ID,此时锁升级为偏向锁

3、当线程A再次试图来获得锁时,JVM发现同步锁对象的标志位是01,是否偏向锁是1,也就是偏向状态,Mark Word中记录的线程id就是线程A自己的id,表示线程A已经获得了这个偏向锁,可以执行同步锁的代码,这也是偏向锁的意义

4、当一个线程B尝试获取锁,JVM发现当前的锁处于偏向状态,并且现场ID不是B线程的ID,那么线程B会先用CAS将线程id改为自己的,这里是有可能成功的,因为A线程一般不会释放偏向锁。如果失败,则执行5

5、偏向锁抢锁失败,则说明当前锁存在一定的竞争,偏向锁就升级为轻量级锁。JVM会在当前线程的现场栈中开辟一块单独的空间,里面保存指向对象锁Mark Word的指针,同时在对象锁MarkWord中保存指向这片空间的指针。上面的保存都是CAS操作,如果竞争成功,代表线程B抢到了锁,可以执行同步代码。如果抢锁失败,则继续执行6

6、轻量级锁抢锁失败,则JVM会使用自旋锁,自旋锁并非是一个锁,则是一个循环操作,不断的尝试获取锁。从jdk1.7开始,自旋锁默认开启,自旋次数由JVM决定。如果抢锁成功,则执行同步代码;如果抢锁失败,则执行7

7、自旋锁重试之后仍然未抢到锁,同步锁会升级至重量级锁,锁标志位改为10,在这个状态下,未抢到锁的线程都会被阻塞,由Monitor来管理,并会有线程的park与unpark,因为这个存在用户态和内核态的转换,比较消耗资源,故名重量级锁

详情请看:https://blog.csdn.net/wyb_gg/article/details/107518521

我通过马士兵老师讲的带味道的栗子大致懂了这个过程(菜鸟版理解)

首先呢,小马去上厕所噗噗噗,但是这个厕所很特殊,门上是没有锁的(无锁状态)

小马觉得这不太安全啊,于是就想了个办法,上厕所噗噗噗的时候先贴上自己的名字,这样是不是就不会遇到尴尬的事(偏向锁)

但是这样还是不好,要是方圆百里只有这一个厕所,翠花和小李都想上厕所怎么办,这时候就发生了锁竞争,他们会通过一个叫CAS来抢这个厕所,他们中有可能成功,把自己的名字贴到厕所门上,那如果没成功呢???

没成功就会升级成轻量级锁,jvm会在当前线程的现场栈开辟一块空间,让翠花和小李在那里转圈圈的抢着谁上厕所(也叫自旋)也是通过CAS来实现的, 自旋的次数是10次以上,或者CPU核数的一半(JDK1.7开始,自旋锁默认开启,自旋次数由JVM决定) 那如果又失败了呢! 俩孩子快拉裤兜子了!!!!!!

这时候就会升级成重量级锁,重量级这个词一听就不一般,JVM说:我头快秃了,干不了了。所以,我们的重量级锁是os老大哥管理的

注:

1.CAS中呢,底层是lock cmpxchg(大家不会的话可以自行百度)CAS也有很多问题:就像ABA啥的,这里就不多bb了

2.那么有的小小猿就会问了,啥时候变成匿名对象呢?是4s以后才会加上偏向锁,变成匿名对象滴,那么咋取消呢,-XX:-UseBiasedLocking 或者去sleep

这就是我对锁升级的理解,如果有错误的话,还望指正

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注编程网的更多内容!

--结束END--

本文标题: java锁升级过程过程详解

本文链接: https://www.lsjlt.com/news/133832.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • java锁升级过程过程详解
    目录1.说到锁升级的过程,我们就得说一下对象头对象头对象头的存在形式接下来让我们看看锁升级的过程专业版解释我通过马士兵老师讲的带味道的栗子大致懂了这个过程(菜鸟版理解)总结1.说到锁...
    99+
    2022-11-12
  • 深入了解Java Synchronized锁升级过程
    目录前言对象结构对象头(1)无锁(2)偏向锁(3)轻量级锁(4)重量级锁对象体对齐字节锁升级补充:Synchronized底层原理EOF前言 首先,synchronized 是什么?...
    99+
    2022-11-13
  • Java中synchronized锁升级的过程
    目录简介CASmarkWordSynchronized的锁升级偏向锁轻量级锁重量级锁总结简介 在多线程中解决线程安全的问题时常用到Synchronized,现在的synchroniz...
    99+
    2022-11-13
  • java中synchronized锁的升级过程
    目录synchronized锁的升级(偏向锁、轻量级锁及重量级锁)java同步锁前置知识点synchronized同步锁java对象头偏向锁轻量级锁重量级锁关于自旋锁打印偏向锁的参数...
    99+
    2022-11-12
  • MySQL 5.7升级8.0过程(详解)
    记一次MySQL 5.7升级8.0的详细过程,聊聊我的思路,希望可以帮助大家。 以一个例子为切入点 一、升级背景 为什么要升级到MySQL8.0?大概多久进行一次? 大家可以参考下图记录的各个版本的发布时间,来确认各个版本的最终补丁日期:...
    99+
    2023-09-08
    mysql 数据库 服务器
  • Windows下升级go版本过程详解
    目录安装命令行工具 choco 安装安装 首次安装需要在官网下载 msi 安装包,安装完后 golang 会自动设置环境变量。在命令行可以使用 go version 查看版本信息。...
    99+
    2023-03-13
    Windows升级go版本 Windows go
  • Linux超详细gcc升级全过程
    目录前言1.当前gcc版本2.安装gcc3.gmp安装4.MPFR编译5.MPC编译6.GCC 配置7.GCC版本更新前言 c c++ 等等 需要这个编译器gcc,最近有DBA的朋友咨询RHEL7.6操作系统安装mysq...
    99+
    2022-06-04
    Linux升级gcc版本 gcc版本如何升级
  • MySQL 5.7升级到8.0详细过程
    一、升级前准备 1.1.MySQL提供mysql-shell验证方式,可以下载后进行验证: 下载shell验证文件:         https://cdn.mysql.com/archives/mysql-shell/mysql-she...
    99+
    2023-09-06
    mysql 数据库 服务器
  • PostgreSQL Master Slave升级过程
    1.初始状态:Master,slave均为running状态。2.升级过程Master1).关闭 master 记录最后检查点位置 (latest checkpoint location),这是宕机时间开始...
    99+
    2022-10-18
  • centos6.4升级Python过程总
    1、查看Python环境:python -V2、下载Python包并解压cd /usr/local/src/   #不一定在这个目录下,只是我习惯在此目录 wget wget http://python.org/ftp/python/2.7...
    99+
    2023-01-31
    过程 Python
  • Centos6.5升级glibc过程介绍
    目录场景需求glibc版本glibc安装glibc软链场景需求 默认的Centos6.5 glibc版本最高为2.12, 而在进行Nodejs开发时项目所依赖的包往往需要更高版本的glibc库支持, 因此在不升级系统的前...
    99+
    2022-06-04
    Centos6.5升级glibc过程
  • Java synchronized轻量级锁实现过程浅析
    目录一、什么是轻量级锁二、为什么引入轻量级锁三、轻量级锁的升级时机四、轻量级锁的演示五、轻量级锁的原理六、轻量级锁升级为重量级锁的流程七、轻量级锁的优缺点一、什么是轻量级锁 轻量级锁...
    99+
    2023-02-11
    Java synchronized轻量级锁 Java synchronized Java轻量级锁
  • centos 6.9 升级glibc动态库的详细过程
    glibc是gnu发布的libc库,即c运行库,glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功...
    99+
    2022-06-04
    centos 6.9 升级glibc动态库 glibc动态库
  • patch升级过程是怎样的
    本篇文章为大家展示了patch升级过程是怎样的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。 记一次补丁升级过程从11.2.0.4.0 到11.2.0.4.3&n...
    99+
    2022-10-19
  • CentOS7环境下gcc(版本10.2.0)升级详细过程
    目录简短介绍1、查看当前gcc版本2、下载gcc安装包(10.2.0版本)3、解压安装包4、下载依赖库5、安装系统必须包模块6、创建编译目录7、生成Makefile文件说明:8、编译9、安装10、配置libstdc++....
    99+
    2022-06-04
    CentOS升级gcc版本 升级gcc版本方法
  • CentOS7环境下gcc(版本10.2.0)升级详细过程
    目录简短介绍1、查看当前gcc版本2、下载gcc安装包(10.2.0版本)3、解压安装包4、下载依赖库5、安装系统必须包模块6、创建编译目录7、生成Makefile文件说明:8、编译...
    99+
    2022-11-12
  • dev升级win11过程中黑屏如何解决
    这篇文章主要介绍了dev升级win11过程中黑屏如何解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇dev升级win11过程中黑屏如何解决文章都会有所收获,下面我们一起来看看吧。首先右键桌面空白处,选择“Ra...
    99+
    2023-07-01
  • Java Servlet响应httpServletResponse过程详解
    目录一、核心方法1.setStatus2.setHeader(String name,String value)3.addHeader(String name,String valu...
    99+
    2022-11-13
  • Java类加载的过程详解
    目录Java:类加载过程1.加载——3件事2.连接2.1.验证2.2.准备2.3.解析3.初始化总结Java:类加载过程 1.加载——3件事 1.通过全类名获取定义此类的...
    99+
    2022-11-12
  • java中的PriorityQueue类过程详解
    目录一、什么是优先级队列1、概念2、案例演示特性3、数据结构一、什么是优先级队列 1、概念 我们都知道队列,队列的核心思想就是先进先出,这个优先级队列有点不太一样。优先级队列中,数据...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作