Java面试synchronized偏向锁后hashcode存址

目录
  • 前言
  • 1、hashcode是啥时候存进对象头中?
  • 2、存在hashcode后,出现synchronized会是什么锁?
  • 3、如果锁状态是 已偏向,再计算hashcode会怎样?
  • 4、总结

前言

今天的文章从下面这张图片开始,这张图片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,则锁是从 偏向锁 直接膨胀为 重量级锁。

以上就是Java面试synchronized偏向锁后hashcode存址的详细内容,更多关于java 偏向锁hashcode存址的资料请关注我们其它相关文章!

(0)

相关推荐

  • java synchronized 锁机制原理详解

    目录 前言: 1.synchronized 的作用: 2.synchronized 底层语义原理: 3. synchronized 的显式同步与隐式同步: 3.1.synchronized 代码块底层原理: 3.2.synchronized 方法底层原理: 4.JVM 对 synchronized 锁的优化: 4.1.锁升级:偏向锁->轻量级锁->自旋锁->重量级锁 4.1.1.synchronized 的 Mark word 标志位: 4.1.2.锁升级过程: 4.2.锁消除: 4.3

  • JAVA偏向锁的原理与实战

    目录 1.偏向锁的核心原理 2.偏向锁代码演示 3.偏向锁的膨胀与撤销 1.偏向锁的撤销 2.批量重偏向与撤销 3.偏向锁的膨胀 总结 1. 偏向锁的核心原理 如果不存在线程竞争的一个线程获得了锁,那么锁就进入偏向状态,此时Mark Word的结构变为偏向锁结构,锁对象的锁标志位(lock)被改为01,偏向标志位(biased_lock)被改为1,然后线程的ID记录在锁对象的Mark Word中(使用CAS操作完成).以后该线程获取锁时判断一下线程ID和标志位,就可以直接进入同步块,连CAS操作

  • Java synchronized偏向锁的核心原理详解

    目录 1.偏向锁的核心原理 2.偏向锁的撤销 3.偏向锁的膨胀 4.偏向锁的好处 总结 1. 偏向锁的核心原理 轻量级锁在没有竞争时(就自己这个线程),每次重入仍然需要执行 CAS 操作. Java 6 中引入了偏向锁来做进一步优化:只有第一次使用 CAS 将线程 ID 设置到对象的 Mark Word 头,之后发现 这个线程 ID 是自己的就表示没有竞争,不用重新 CAS.以后只要不发生竞争,这个对象就归该线程所有. public class Main { static final Objec

  • 从汇编代码开始全面解析synchronized还原最真实的偏向锁

    目录 前言 一.TemplateTable::monitorenter() 二.lock_object(): 三.biased_locking_enter() 1).参数 2).概念 3).源码 前言 我们都知道java之所以跨平台能力强,是因为java在编译期没有被编译成机器码,而是被编译成字节码.早期的jvm会将编译好的字节码翻译成机器码解释执行,我们在jvm的源码中还可以看到早期的解释器——bytecodeInterpreter.cpp(虽然已经不再使用).对于字节码这种总数固定,解释逻辑

  • Java中的关键字synchronized 详解

    在并发编程中,synchronized关键字是常出现的角色.之前我们都称呼synchronized关键字为重量锁,但是在JDK1.6中对synchronized进行了优化,引入了偏向锁.轻量锁.本篇介绍synchronized关键字的使用方式,区别和偏向锁.轻量锁和重量锁实现原理. 先看看synchronized关键字的4种用法. 1.修饰普通方法 private synchronized void synMethod(){ } 这种用法中,synchronized锁的对象实例. 2.修饰静态方

  • Java面试synchronized偏向锁后hashcode存址

    目录 前言 1.hashcode是啥时候存进对象头中? 2.存在hashcode后,出现synchronized会是什么锁? 3.如果锁状态是 已偏向,再计算hashcode会怎样? 4.总结 前言 今天的文章从下面这张图片开始,这张图片Java开发们应该很熟悉了 我们都知道无锁状态是对象头是有位置存储hashcode的,而变为偏向锁状态是没有位置存储hashcode的,今天我们来通过实现验证这个问题:当锁状态为偏向锁的时候,hashcode存到哪里去了? 先说结论: jdk8偏向锁是默认开启,

  • Java实现synchronized锁同步机制

    目录 synchronized 实现原理 适应性自旋(Adaptive Spinning) 锁升级 Java 对象头 偏向锁(Biased Locking) 偏向锁获取 偏向锁释放 关闭偏向锁 轻量级锁(Lightweight Locking) 轻量级锁获取 轻量级锁解锁 重量级锁 锁消除(Lock Elimination) 锁粗化(Lock Coarsening) 文末总结 synchronized 是 java 内置的同步锁实现,一个关键字实现对共享资源的锁定.synchronized 有

  • java中synchronized锁的升级过程

    目录 synchronized锁的升级(偏向锁.轻量级锁及重量级锁) java同步锁前置知识点 synchronized同步锁 java对象头 偏向锁 轻量级锁 重量级锁 关于自旋锁 打印偏向锁的参数 synchronized原理解析 一:synchronized原理解析 1:对象头 2:Synchronized在JVM中的实现原理 三.锁的优化 1.锁升级 2.锁粗化 3.锁消除 synchronized锁的升级(偏向锁.轻量级锁及重量级锁) java同步锁前置知识点 1.编码中如果使用锁可以

  • JAVA对象分析之偏向锁、轻量级锁、重量级锁升级过程

    在HotSpot虚拟机里,对象在堆内存中的存储布局可以划分为三个部分: 对象头(Header) 实例数据(Instance Data) 对齐填充(Padding). 对象头 HotSpot虚拟机(后面没有说明的话默认是这个虚拟机)对象头包括三部分: Mark Word 指向类的指针 数组长度(只有数组对象才有) 对象头之Mark Word Mark Word记录了对象和锁有关的信息,当这个对象被synchronized关键字当成同步锁时,围绕这个锁的一系列操作都和Mark Word有关. Mar

  • Java中synchronized关键字引出的多种锁 问题

    前言 Java 中的 synchronized关键字可以在多线程环境下用来作为线程安全的同步锁.本文不讨论 synchronized 的具体使用,而是研究下synchronized底层的锁机制,以及这些锁分别的优缺点. 一 synchronized机制 synchronized关键字是JAVA中常用的同步功能,提供了简单易用的锁功能. synchronized有三种用法,分别为: 用在普通方法上,能够锁住当前对象.用在静态方法上,能够锁住类用在代码块上,锁住的是synchronized()里的对

  • java中synchronized Lock(本地同步)锁的8种情况

    目录 lock1 lock2 lock3 lock4 lock5 lock6 lock7 lock8 Lock(本地同步)锁的8种情况总结与说明: * 题目: * 1.标准访问,请问是先打印邮件还是短信 Email * 2.email方法新增暂停4秒钟,请问是先打印邮件还是短信 Email * 3.新增普通的hello方法,请问先打印邮件还是hello hello * 4.两部手机,请问先打印邮件还是短信 SMS * 5.两个静态同步方法,1部手机,请问先打印邮件还是短信 Email * 6.两

  • Java面试最容易被刷的重难点之锁的使用策略

    目录 一. 乐观锁和悲观锁 1. 字面理解 2. 生活实例 3. 基于版本号方式实现乐观锁 二. 读写锁 1. 理解 2. 用法 三. 重量级锁和轻量级锁 1. 原理 2. 理解 3. 区分用户态和内核态 四. 自旋锁 1. 理解 2. 实现方式 3. 优缺点 五. 公平锁和非公平锁 1. 理解 2. 注意事项 六. 可重入锁和不可重入锁 1. 为什么要引入这两把锁 (1)实例一 (2)实例二 2. 实现方案 七. 面试题 第一题 第二题 第三题 第四题 在多线程的学习中,很多时候都要用到锁,但

随机推荐