《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,一经查实,立即删除!

相关文章

[html] 你有使用过del标签吗?说说它的用途

[html] 你有使用过del标签吗?说说它的用途 这个del标签的话它的作用是在内容文本中间加一道横线 我之前有做过一个电商重构的页面 在标价部分 原价跟现价那块用过 因为促销 原价已经不起作用 所以需要用del标签包裹个人简介 我是歌谣,欢迎和大家一起交…

SQL 2005: @@identity 的妙用

insert into a values(aaaaa) print identity; //打印刚生成的主键值.**update a set cAAAAAAAAAAAA where b15print identity;转载于:https://www.cnblogs.com/MySpace/archive/2009/11/10/1599797.html

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

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

[html] 你有使用过ins标签吗?说说它的用途

[html] 你有使用过ins标签吗?说说它的用途 为标签中的内容加入下划线, ins标签是一个语义标签,用于标注其为插入文档信息 ins标签是html5中的新标签个人简介 我是歌谣,欢迎和大家一起交流前后端知识。放弃很容易, 但…

rails table html,Ruby on Rails:如何将字符串呈现为HTML?

我有str "Hi"在我的erb视图中:当我真正想要的是Hi时,页面上将显示:Hi。 将字符串"解释"为HTML标记的红宝石方法是什么?编辑:这种情况str "hello"如果我认为HTML源代码是>&#xff0c…

实验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…

DZ NT!架构

http://www.cnblogs.com/aaa6818162/archive/2009/05/24/1488236.html转载于:https://www.cnblogs.com/chenbg2001/archive/2009/11/11/1601230.html

iec104点号_QTouch之IEC60870-104通讯

QTouch之IEC60870-104通讯作者&#xff1a;舜通智能 来源&#xff1a;www.sitcsys.com 发布时间&#xff1a;2020-04-06热度&#xff1a;0一、协议简介IEC60870-104规约是一个广泛应用于电力、城市轨道交通等行业的国际标准&#xff0c;由国际电工委员会制定。IEC104规约把IEC1…

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

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

SQLite数据库如何存储和读取二进制数据

1. 存储二进制数据SQLite提供的绑定二进制参数接口函数为:int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*));我们希望使用的是一套经过封装的COM接口&#xff0c;将上面这个函数封装为COM接口的形式BindParaByIndex( LONG index, VARIANT…

[html] 你有使用过summary标签吗?说说它的用途

[html] 你有使用过summary标签吗&#xff1f;说说它的用途 没有用过这个标题&#xff0c;认真地查阅了一下。 发现summary标签和details标签是配套使用的&#xff0c;而且仅有Chrome和Safari 6浏览器支持。 summary标签是作为details标签里的标题&#xff0c;details标签用于描…

Git 仓库 清理 瘦身

第一步&#xff0c;找出大文件或误添加的文件 git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | awk {print $1})" 第二步&#xff0c;从仓库中删除文件或文件夹 删文件&#xff0c;将 bigfile 换成上…

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

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

电大计算机网考选择题多少分,2016年度电大计算机网考选择题及标准答案.doc

2016年度电大计算机网考选择题及标准答案^计算机网考选择题及答案1.微型计算机的性能指标不包括______。DA.字长 B.存取周期 C.主频 D.硬盘容量2.计算机硬件系统的主要组成部件有五大部分&#xff0c;下列各项中不属于五大部分的是______。BA.运算器 B.软件 C.I/O设备 D.控制器…

Oracle OCM 认证指南

OCM考试全称为Oracle Certified Master(Oracle认证大师)&#xff0c;是在OCA(Oracle认证专员Oracle Certified Associate)、OCP(Oracle认证专家Oracle Certified Professional)之后更高一级的Oracle技术认证&#xff0c;也是Oracle技术认证最高的一个级别。 考试是两天的时间&a…

李宏毅机器学习课程---2、Regression - Case Study

李宏毅机器学习课程---2、Regression - Case Study 一、总结 一句话总结&#xff1a; 分类讨论可能是比较好的找最佳函数的方法&#xff1a;如果 有这样的因素存在的话 模型不够好&#xff0c;可能是因素没有找全 因素以及函数的复杂度&#xff0c;并不是越高越好&#xff0c;适…

[html] 如何动态修改`<title>`的标题名称?

[html] 如何动态修改<title>的标题名称&#xff1f; 1、原生&#xff1a;document.getElementsByTagName("title")[0].innerText your title document.title your title 2、jquery: $(title).html(your title) $(title).text(your title)个人简介 我是歌谣…

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

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

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

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

UNICODE字符集

Unicode &#xff1a;宽字节字符集1. 如何取得一个既包含单字节字符又包含双字节字符的字符串的字符个数&#xff1f;可以调用Microsoft Visual C的运行期库包含函数_mbslen来操作多字节&#xff08;既包括单字节也包括双字节&#xff09;字符串。调用strlen函数&#xff0c;无…