《Java并发编程的艺术》之synchronized的底层实现原理

在学习锁优化时,对象头(Mark Word) 是必不可缺的一环,因为synchronized 用的锁是存在对象头里的。32位的虚拟机上对象头占64位(8字节),64位的虚拟机上对象头占128位(16字节)[^objectHead];而不同的类型,对象头的布局不太一样:

  • 数组类型:Mark Word、Class Metadata Address、Array Length
  • 普通类型:Mark Word、Class Metadata Address

Mark Word 表示对象的HashCode锁信息
Class Metadata Address 表示对象的数据类型在方法区对应的地址
Array Length 表示数组的长度(只在对象是数组的情况下才会存在)

对象头的默认表示应该如下所示

锁状态25bit4bit1bit是否是偏向锁2bit 锁标志位
无状态锁对象的hashcode对象分代年龄001

具体的对象内存布局看这篇文章

而根据JVM的设置1,具体分配时又会有不同的情况,如下所示

偏向锁到重量锁的过程

当关闭了偏向锁的设置,那么就会走左边的流程;反之则走右边的流程。

偏向锁

由于大多数情况下,锁大多都不处于多线程竞争状态,而且总是由同一个线程获取,所以JVM在1.6之后加入了偏向锁轻量锁 ,如今总共由4种锁状态:无状态锁偏向锁轻量锁重量锁。随着线程竞争的提升,锁会逐渐升级(无法降级)。
偏向锁在没有竞争的情况下可以提高同步的性能,这方面主要体现在偏向锁只需要进行一次CAS而轻量锁需要两次。它是一个需要权衡利弊的选择,它不是在任何情况下都对程序有利的。如果竞争很多,那么撤销偏向锁的过程就会成为性能瓶颈。

当偏向锁可用时,初始化的对象头分配如下所示

锁状态23bit2bit4bit1bit 是否是偏向锁2bit 锁标志位
偏向锁线程IDepoch对象分代年龄101

加锁过程

  1. 当对象头的isBiased 为1时且锁状态为01时,偏向锁可用,继续后面的流程
  2. 判断目标对象头是否包含本线程ID,如果没有,则直接CAS往对象头里写入本线程ID。到这一步加锁就结束了

锁撤销

由于偏向锁使用了一种直到竞争发生时才会释放的机制,所以当其他线程竞争偏向锁时,持有偏向锁的线程才会去释放锁。

  1. 等待原持有偏向锁的线程(后文简称原线程)运行至全局安全点(safe point)
  2. 暂停原线程
  3. 检查原线程 的线程状态,如果退出了同步代码块,则重偏向;反之升级为轻量锁
  4. 恢复原线程

轻量锁

加锁过程

注意:轻量锁会一直保持,唤醒总是发生在轻量锁解锁的时候,因为加锁的时候已经成功CAS操作;而CAS失败的线程,会立即锁膨胀,并阻塞等待唤醒。
引用Java并发编程艺术的图片

  1. 第一次进入同步块,开辟一个叫做Lock Record 的空间用于存储锁记录
    InitLockRecord.png
  2. 将对象头中的Mark Word 复制到 当前线程栈中
  3. 尝试用CAS将Mark Word 替换指向Lock Record的指针 CopyMW2LockRecord.png
  4. 第三步操作成功,则将Mark Word 设置为00状态,标识轻量锁
  5. 然后执行同步体
  6. 第三部操作失败,进入自旋获取锁
  7. 自旋获取锁的失败次数到达阈值,膨胀锁,修改为重量级锁(状态改为10
  8. 线程阻塞

锁释放过程

  1. 尝试CAS将Lock Record的Owner 复制回 Mark Word
  2. 如果CAS操作成功,则表示没有竞争发生;否则看步骤3
  3. 释放锁并唤醒等待的线程

总结

本章是对synchronized 在JVM里的各种等级及升级的流程进行了讲解,其中主要是通过控制对象头的一些状态来控制锁的等级。偏向锁通过标记Thread ID 来表示,当前对象已经被对应线程占用;轻量锁则替换Mark WordLock Record 地址 来表示当前对象被对应线程占用。无论是哪种锁,在不同的场景下有不同的需求,可以参考以下表格做出选择

偏向锁:

  • 优点:加锁和解锁不需要额外消耗,和执行非同步方法相比,仅存在纳秒级的差距
  • 缺点:如果线程间存在竞争,会带来额外开销(偏向锁的撤销)
  • 适用场景: 适用于只有一个线程访问同步块的场景

轻量锁:

  • 优点: 竞争的线程不会造成阻塞,提高了程序的响应速度
  • 缺点: 如果始终得不到锁,使用自旋会消耗CPU
  • 适用场景: 追求相应实践,同步块执行速度非常快

重量锁:

  • 优点: 线程竞争不使用自选,不会消耗CPU
  • 缺点: 线程阻塞,响应时间缓慢
  • 适用场景: 追求吞吐量,同步块执行速度较慢

这个是网上找到的关于锁撤销、膨胀等操作的总流程
%E5%81%8F%E5%90%91%E9%94%81%E5%88%B0%E9%87%8D%E9%87%8F%E9%94%81%E7%9A%84%E5%8D%87%E7%BA%A7.jpg


  1. 关于偏向锁的相关JVM设置:-XXBiasedLockingStartupDelay=0表示启动程序几秒钟后激活偏向锁-XXUseBiasedLocking=false表示关闭偏向锁(确定会发生竞争时可以这么设置)↩

转载于:https://www.cnblogs.com/codeleven/p/10963092.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/411224.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文字投影_店铺门口投影灯,引领店铺新潮流

在社会的进步下,现在人们物质生活越来越好,在原来消费的基础上也更加注重消费时店铺的装修、氛围。装修精致、环境优雅的店铺不仅更加容易吸引顾客,并且更加容易让顾客打卡发圈,无形中也帮自己做了一波宣传。上次我们出去游玩的时…

实验5

一、 1 #ifndef MACHINEPETS_H2 #define MACHINEPETS_H3 #include<iostream>4 #include<string>5 using namespace std;6 class MachinePets7 {8 public:9 MachinePets(const string s) :nickname(s) {} 10 virtual string talk()0; 11 string getnick…

计算机网络ieee,博士生程珂论文连续两年被计算机网络顶级会议IEEE INFOCOM录用...

近日&#xff0c;第39届IEEE国际计算机通信会议(IEEE International Conference on Computer Communications, IEEE INFOCOM 2020)录用结果揭晓&#xff0c;陕西省网络与系统安全重点实验室沈玉龙教授课题组博士生程珂的论文《A Lightweight Auction Framework for Spectrum Al…

去除标题_资深运营导师-云中教你轻松写标题

一、标题作用解读标题对于产品的意义买家购买逻辑想到一款产品&#xff0c;并知道他的名称去网上搜索&#xff0c;看到图片等信息类比价格评价等内容&#xff0c;下单收到货和自己根据标题照片评判商品核心要点&#xff1a;买家是根据产品名字作为购买切入点&#xff1b;照片和…

报名学校计算机考试在哪里报,全国计算机等级考试报名流程

全国计算机等级考试报名流程全国计算机等级考试采用全国统一命题&#xff0c;统一考试的形式&#xff0c;各科目均为上机操作考试。1&#xff0e;上网填报基本信息考生可任意选择地点并在规定时间内上网填报、修改及查询本人信息。填报过程分为登录、查看提示信息、输入并提交报…

卸载一直在创建还原点_如何创建系统还原点以及如何恢复?

如何创建系统还原点1、在搜索框中输入“创建还原点”并打开。2、在“系统保护”选项卡中点击“创建”。3、为此次还原点添加备注描述&#xff0c;此处命名为测试&#xff0c;点击创建即可。恢复系统至上一个还原点1、在刚才的“系统保护”界面中点击“系统还原”。2、在弹出的系…

学生党的Surface Pro 5乞丐版使用体验

因为已经装了台式机&#xff0c;大一开学时买的厚重且续航差的华硕游戏本&#xff08;i5GTX950M8G)对我这个考研党已经显得不合适了。恰巧有一同学笔记本坏了&#xff0c;我便将游戏本低价出了&#xff0c;然后用两三倍的价格&#xff0c;入手了surface pro5 (new surface)的最…

2018计算机河北省高考试题,2018年河北高考物理压轴试题【含答案】

2018年河北高考物理压轴试题【含答案】18&#xff0e;如图4所示&#xff0c;由粗细均匀的电阻丝制成的边长为L的正方形金属框向右匀速运动&#xff0c;穿过方向垂直金属框平面向里的有界匀强磁场&#xff0c;磁场宽度d2L。从ab边刚进入磁场到金属框全部穿出磁场的过程中&#x…

富士通01018z平板电脑评测_档案扫描好帮手,富士通ix1500无线双面高速扫描仪评测...

扫描仪是办公中常用的一种设备&#xff0c;尤其是建立了较为完备的档案管理制度的企业和组织&#xff0c;经常需要扫描和存档大量的文稿和图像&#xff0c;下文就介绍一台获得日本Good Design设计奖的无线高速扫描仪——富士通ScanSnap iX1500。打开包装可以看到ScanSnap iX150…

工厂模式 + 反射 ?= 灵活多变的数据库

工厂模式 反射 ? 灵活多变的数据库么 由于现实项目中我们难保会客户会更换系统的数据库&#xff0c;这样我们需要把若干数据库各种情况基本上都想到。多种数据库&#xff0c;引出抽象&#xff0c;我们就能在众多数据库的上层抽出一个Factory&#xff0c;由Factory去引导具体…

中使用swiper不能自动切换_液晶拼接墙显示系统中矩阵切换器使用的注意事项

近年来在液晶拼接墙显示系统中矩阵切换器的使用已变得越来越普遍、这主要是因为各矩阵切换器品牌商根据众多用户的实际需求对矩阵进行了同能扩展与完善。这也使得矩阵切换器除了使用在大屏拼接显示系统外还适用于多媒体会议系统、调度指挥系统、数字化城市建设、安防等工程。而…

计算机的双一流学校,分数不够上双一流大学计算机专业,上这些大学也不错,实力非常强...

有句话说“穷人就学计算机”&#xff0c;为什么会有这种说法呢&#xff1f;学计算机是穷人翻身最快的途径&#xff1f;的确&#xff0c;因为计算机是一项可以不靠人脉、不需要过高的口才的技术性工作。对于穷人来说&#xff0c;无背景无社会资源&#xff0c;只能靠自己&#xf…

Jupyter Notebook 使用小记

简介 Jupyter Notebook 是一款几乎综合所有编程语言&#xff0c;能够把软件代码、计算输出、解释文档、多媒体资源整合在一起的多功能科学计算平台。具有如下优点&#xff1a; 整合所有资源交互性编程体验零成本重现结果安装 本地安装 # python3 python3 -m pip install --upgr…

陕西省高级职称 计算机要求,陕西省卫生高级职称评审申报条件

陕西省卫生高级职称评审申报条件2014年-2015年陕西省卫生高级职称评审申报条件我所经历的陕西省卫生高级职称评审经验谈 贴上一个目前陕西省最权威的晋升高级职称的文件&#xff0c;重点看最后一段我的个人经验。(二)学历资历条件&#xff1a;1、晋升正高级资格&#xff0c;必须…

Django第二篇

django第二篇 1.静态文件配置 接口前缀&#xff1a; ​ STATIC_URL /static/ 跟静态文件夹的名字没有关系&#xff0c;默认情况下这个前缀跟静态文件夹名字一样 文件配置 STATICFILES_DIRS [ ​ os.path.join(BASE_DIR,static) ] static:就是你的静态文件夹路径&#xff0c;可…

html input file name,HTML Input FileUpload name用法及代码示例

name属性用于设置或返回文件上传按钮的name属性的值。名称属性用于在提交到服务器后标识表单数据。用法:返回名称属性&#xff1a;fileuploadObject.name设置名称属性&#xff1a;fileuploadObject.namename属性值&#xff1a;name:指定文件上传按钮的名称。示例1&#xff1a;返…

PS教程第三课:PS界面

ctrl 移动 滚轮 多种命令

坡度土方计算案例_土石方工程造价中的细节解析(案例+计算式)

每个房建工程都避不开土石方工程&#xff0c;许多人知道怎样算量&#xff0c;也知道怎样组价&#xff0c;但是却有很多小细节的注意点被忽略&#xff0c;现将土石方工程从算量到组价的全过程整理&#xff0c;希望对大家深刻理解土石方规则&#xff0c;掌握手算及软件算技巧、组…