目录

1.markWord结构

2. 偏向锁流程

3. 批量重偏向与批量撤销


我们都知道synchronized包含偏向锁,轻量锁,重量锁,其中偏向锁细节上最为复杂,下面简单说明偏向锁。

需要提一下,jdk16不在支持偏向锁,原因是:偏向锁导致synchronization子系统的代码复杂度过高,难以维护、升级。且偏向锁带来的加锁时性能提升从整体上看并没有带来过多收益(撤销锁的成本过高 需要等待全局安全点,再暂停线程做锁撤销)

1.markWord结构

markWord:describes the header of an object

markWord是什么?

它描述了java对象头。准确的说它是对象头中的一部分。

从oopDesc说起,oopDesc在hotspot中是所有对象的基类。_mark属性保存了对象运行时的状态,包括hashcode,age,偏向锁标志,锁标志等。_metadata是描述对象的元数据,可以理解为Class<T>。这样C++就能通过它来获取对象属性和方法等。

class oopDesc {private:volatile markWord _mark;union _metadata {Klass*      _klass;narrowKlass _compressed_klass;} _metadata;
}

markWord在不同操作系统中的位描述。

32 bits:
//  --------
//             hash:25 ------------>| age:4    biased_lock:1 lock:2 (normal object)
//             JavaThread*:23 epoch:2 age:4    biased_lock:1 lock:2 (biased object)
64 bits:
//  --------
//  unused:25 hash:31 -->| unused_gap:1   age:4    biased_lock:1 lock:2 (normal object)
//  JavaThread*:54 epoch:2 unused_gap:1   age:4    biased_lock:1 lock:2 (biased object)

markWord初始状态

[0 | 0| 0| 1 | 01]       系统环境没有禁用偏向锁
[0 | 0| 0| 0 | 01]       禁用了偏向锁

偏向锁状态:

biased lock pattern:包含两种状态
[JavaThread* | epoch | age | 1 | 01]       偏向某个线程
[0           | epoch | age | 1 | 01]       匿名偏向锁,有两种情况:偏向锁初始状态,或者偏向锁升级为轻量锁产生的短暂的中间状态

2. 偏向锁流程

借用别人比较全面的流程图,需要注意到,重偏向很少发生,了解即可。

还有在第一次调用某个对象的Object.hashcode()时,会将哈希值写到markword中,此时无论是偏向锁还是轻量锁都会与hashcode冲突,只能使用重量锁了。重量锁也冲突,但它通过在objectmoniter中记录hashcode值来解决冲突。

3. 批量重偏向与批量撤销

这两种情况比较罕见,可以只做了解。

批量重偏向和批量撤销是针对类的优化,和对象无关。以class为单位维护一个撤销计数器,这个值记录在class的epoch中,每次撤销加1,达到20次时触发批量重偏向,后续该class上的撤销均会重偏向。达到40次时,JVM会标记该class为不可偏向,之后对于该class的锁,直接走轻量级锁的逻辑,表现为该类的新实例对象会被禁用偏向锁,且已有的偏向锁重偏向一次之后不可再次重偏向。

批量重偏向:唯一重偏向场景。当一个线程创建了大量对象并执行了初始的同步操作,后来另一个线程也来将这些对象作为锁对象进行操作,这样会导致大量的偏向锁撤销操作,性能消耗较大。
批量撤销:在明显多线程竞争剧烈的场景下使用偏向锁是不合适的。
借用该文中的偏向锁批量重偏向与批量撤销测试帮助读者们理解 https://www.cnblogs.com/LemonFive/p/11248248.html。自行测试maven引入

<dependency><groupId>org.openjdk.jol</groupId><artifactId>jol-core</artifactId><version>0.15</version>
</dependency>

synchronized偏向锁相关推荐

  1. Java Synchronized 偏向锁/轻量级锁/重量级锁的演变过程

    前言 线程并发系列文章: Java 线程基础 Java 线程状态 Java "优雅"地中断线程-实践篇 Java "优雅"地中断线程-原理篇 真正理解Java ...

  2. Java synchronized偏向锁、轻量级锁、重量级锁

    简介 synchronized锁共有偏向锁.轻量级锁.重量级锁三种类型,而这三种类型的加锁方式都是相同的,写代码时不用考虑加哪种锁.使用锁时对象首先会变为偏向锁状态,当有其它线程获取锁时会升级为轻量级 ...

  3. Java synchronized偏向锁后hashcode存在哪里?

    今天的文章从下面这张图片开始,这张图片Java开发们应该很熟悉了 我们都知道无锁状态是对象头是有位置存储hashcode的,而变为偏向锁状态是没有位置存储hashcode的,今天我们来通过实现验证这个 ...

  4. Synchronized偏向锁、轻量级锁、重量级锁详解

    一.偏向锁加锁 1.通过CAS操作将当前线程的地址设置到锁对象的markword中.如果设置成功了,那么就是设置偏向锁成功了 2.在当前线程的栈贞中,创建锁记录(Lock Record),使这个锁记录 ...

  5. 【正本清源】Synchronized 源码全解之偏向锁的获取(基于 Openjdk12)

    文章目录 BasicObjectLock BasicLock oopDesc markOopDesc 偏向锁 偏向锁的获取 monitorenter 源码验证(bytecodeInterpreter. ...

  6. Java Synchronized 重量级锁原理深入剖析上(互斥篇)

    前言 线程并发系列文章: Java 线程基础 Java 线程状态 Java "优雅"地中断线程-实践篇 Java "优雅"地中断线程-原理篇 真正理解Java ...

  7. 偏向锁、轻量级锁、重量级锁加锁过程即锁升级膨胀过程

    偏向锁.轻量级锁.重量级锁加锁过程即锁升级膨胀过程 synchronized 偏向锁 为什么要引入偏向锁 偏向锁加锁过程 线程获取到锁对象的偏向锁之后,执行完同步代码块之后,会释放这个偏向锁吗 使用了 ...

  8. 线程安全(中)--彻底搞懂synchronized(从偏向锁到重量级锁)

    接触过线程安全的同学想必都使用过synchronized这个关键字,在java同步代码快中,synchronized的使用方式无非有两个: 通过对一个对象进行加锁来实现同步,如下面代码. synchr ...

  9. Java并发编程:Synchronized底层优化(偏向锁、轻量级锁)

    一.重量级锁 上篇文章中向大家介绍了Synchronized的用法及其实现的原理.现在我们应该知道,Synchronized是通过对象内部的一个叫做监视器锁(monitor)来实现的.但是监视器锁本质 ...

  10. 死磕Synchronized底层实现--偏向锁

    注:本篇很长,请找个舒适的姿势阅读. 本文为synchronized系列第二篇.主要内容为分析偏向锁的实现. 偏向锁的诞生背景和基本原理在上文中已经讲过了,强烈建议在有看过上篇文章的基础下阅读本文. ...

最新文章

  1. 沈阳农业大学计算机往年录取分数6,沈阳农业大学历年分数线 2021沈阳农业大学录取分数线...
  2. com.alibaba.fastjson.JSONException: not close json text, token : :
  3. 在装有raid卡的服务器上安装Ubuntu
  4. css-适配布局类型-流式布局-响应式布局
  5. 中筛选为某个列表中_关于Excel中“高级筛选”的这些技巧,必须掌握!
  6. filter过滤后重新添加_Kibana基本使用---使用Flight Dashboard过滤数据
  7. 使用windows 命令行创建一个空的文本文件
  8. ios知识整理 (未完成)
  9. freeswitch连接postgres数据库
  10. 边缘保留滤波matlab,【DIP】各种边缘保留滤波器一览
  11. 缠中说禅电子书_缠中说禅108课PDF电子书
  12. 七层代理与四层代理区别
  13. 芯片后端的APR指什么?
  14. 时间展示 星期几时英文需要显示成中文问题解决
  15. 论文笔记:多标签学习——ACkEL算法
  16. [转载]提升你幽默感的100句经典短语
  17. Android:启动流程
  18. python3 + wxpython 实现RSA加密聊天室
  19. 关于“C2248 QString::QString 无法访问private成员的问题”
  20. 数据结构与算法10:图与图搜索

热门文章

  1. 电脑记事本增强版notepad++
  2. 文档加密图纸加密方案之沙盒
  3. 自己碰到的一个“无法读取源文件或磁盘”问题处理
  4. Onvif协议:IPC客户端开发之图像抓拍
  5. 大数据+人工智能时代,电子招投标更符合未来趋势
  6. 小白如何快速入门数学建模
  7. 课设(房屋出租系统)
  8. 钱天财8.25黄金白银在线分析及黄金在线解套
  9. 微机原理 寻址方式 及基于EMU8086的用例
  10. uniapp好用项目和插件总结