Java面试synchronized偏向锁后hashcode存址
作者:猪哥66 发布时间:2023-08-09 09:15:06
前言
今天的文章从下面这张图片开始,这张图片Java开发们应该很熟悉了
我们都知道无锁状态是对象头是有位置存储hashcode的,而变为偏向锁状态是没有位置存储hashcode的,今天我们来通过实现验证这个问题:当锁状态为偏向锁的时候,hashcode存到哪里去了?
先说结论:
jdk8偏向锁是默认开启,但是是有延时的
可通过参数: -XX:BiasedLockingStartupDelay=0关闭延时。hashcode是懒加载,在调用hashCode方法后才会保存在对象头中。
当对象头中没有hashcode时,对象头锁的状态是 可偏向( biasable,101,且无线程id)。
如果在同步代码块之前调用hashCode方法,则对象头中会有hashcode,且锁状态是 不可偏向(0 01),这时候再执行同步代码块,锁直接是 轻量级锁(thin lock,00)。
如果是在同步代码块中执行hashcode,则锁是从 偏向锁 直接膨胀为 重量级锁。
1、hashcode是啥时候存进对象头中?
根据下图我们可知,hashcode并不是对象实例化后就创建,而是在调用默认的hasCode方法时才会放进对象头。
第一次打印的对象头中我们发现对象头中mark word值为16进制的5,转为2进制就是101,且后面的状态显示为biasable,也就是可偏向,注意区分可偏向和已偏向:可偏向表示还么有synchronized锁,已偏向表示有线程访问锁。
第二次打印对象头中已经存在hashcode,value为0x00000039a054a501,转换为2进制为:11100110100000010101001010010100000001,最后三位也就是0 01,这就表示不可偏向,也就说当出现synchronized锁不会进行偏向,真是如此吗?我们验证一下!
2、存在hashcode后,出现synchronized会是什么锁?
根据下图我们可以清晰的看到,当已存在hashcode再执行同步代码,则会直接进入轻量级锁,原因还是上面的结论,有hashcode后将锁设置为 不可偏向,那肯定就直接上轻量级锁咯。
3、如果锁状态是 已偏向,再计算hashcode会怎样?
前面两种情况锁状态都是 可偏向 状态,如果此时锁状态是 已经进入偏向状态呢?是会进行锁升级嘛?
根据下图我们可以看到,当hashCode方法处于synchronized代码块中时,锁直接升级为重量级锁。
至于为什么直接升级为重量级锁而不是轻量级锁,这个原因不得而知。
猪哥猜想可能无线程竞争状态下,偏向锁升级为重量级锁消耗的资源比轻量级锁消耗的资源少。
同时欢迎知道原因的同学能够留言告知,也欢迎大家说出自己的猜想?没准以后会根据你的方案优化呢!
4、总结
jdk8偏向锁是默认开启,但是是有延时的,可通过参数: -XX:BiasedLockingStartupDelay=0关闭延时。
hashcode是懒加载,在调用hashCode方法后才会保存在对象头中。
当对象头中没有hashcode时,对象头锁的状态是 可偏向( biasable,101,且无线程id)。
如果在同步代码块之前调用hashCode方法,则对象头中会有hashcode,且锁状态是 不可偏向(0 01),这时候再执行同步代码块,锁直接是 轻量级锁(thin lock,00)。
如果是在同步代码块中执行hashcode,则锁是从 偏向锁 直接膨胀为 重量级锁。
来源:https://blog.csdn.net/u014044812/article/details/124302959


猜你喜欢
- 使用spring框架实现数据库事务处理事务对于数据库来说是,是对sql语句的一系列操作,这些操作被组织成为一个事务。事务具有原子性的,要么全
- 调用和回调机制在一个应用系统中, 无论使用何种语言开发, 必然存在模块之间的调用, 调用的方式分为几种:1.同步调用同步调用是最基本并且最简
- Android自定义view是什么在我们的日常开发中,很多时候系统提供的view是无法满足我们的需求的,例如,我们想给一个edittext加
- Ctrl+1 快速修复Ctrl+D: 删除当前行 Ctrl+Alt+↓ 复制当前行到下一行(复制增加)Ctrl+Alt+↑ 复制当
- Android webview 从Lollipop(5.0)开始webview默认不允许混合模式,https当中不能加载http资源,需要设
- 过滤器是Servlet的规范,是基于函数回调的,需要实现javax.servlet.Filter接口,依赖于Tomcat等容器,一般用于过滤
- 我们在常用的电商或者旅游APP中,例如美团,手机淘宝等等,都能够看的到有那种下拉式的二级列表菜单。具体如图所示:上面两张图就是美团的一个二级
- Excelapache 为 java开发者们提供了一套excel表格读写的工具:POI ,对于一个小白来说每次读写使用POI需要写一套复杂的
- Springboot上传文件时提示405问题描述:上传文件时请求不通,状态码返回405,如下图: 问题分析:405 Method
- 本文实例为大家分享了Android实现支付宝记账饼图,点击旋转到最下面,供大家参考,具体内容如下代码:package com.example
- 本文实例为大家分享了Java工具类DateUtils的具体代码,供大家参考,具体内容如下import java.text.ParseExce
- springboot URL带有斜杠的转义字符百分之2F导致的400错误今天项目上出现一个问题,是前端的GET请求url中带有路径参数,这个
- 现有的热修复框架很多,尤以AndFix 和Tinker比较多具体的实现方式和项目引用可以参考网络上的文章,今天就不谈,也不是主要目的今天就来
- 折半查找法仅适用于对已有顺序的数组、数据进行操作!!!(从小到大)自我总结:折半查找法就是相当于(通过改变low或high的大小)把中间位置
- 1. 创建自定义 * 类并实现 HandlerInterceptor 接口package com.xgf.online_mall.inter
- 在开发中,我们经常会使用IO操作,例如创建,删除文件等操作。在项目中这样的需求也较多,我们也会经常对这些操作进行编
- 已知字符串“aabbbcddddeeffffghijklmnopqrst”编程找出出现最多的字符和次数,要求时间复杂度小于O(n^2)/**
- MD5,全称为 Message Digest Algorithm 5(消息摘要算法第五版).详情请参考 * :MD5MD5加密后是一个字
- Windows10 上的JDK安装配置1、前往 JDK 官网下载对应 jdk 版本安装包:下载地址本文以 jdk-8u161-windows
- 代码很简单,如下所示: package swt_jface.demo1; import org.eclipse.swt.SWT; impor