Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >并发基础之Synchronized原理

并发基础之Synchronized原理

作者头像
崩天的勾玉
发布于 2021-12-20 09:33:22
发布于 2021-12-20 09:33:22
2950
举报
文章被收录于专栏:崩天的勾玉崩天的勾玉

上篇文章和大家聊了聊hashmap和concurrenthashmap的结构、用法、原理,从这篇文章开始次我们来聊聊并发编程吧!本次我将带大家了解一下synchronized的原理。

synchronized从1.6优化了之后并不是上来就很重,而是有了多个锁状态,分别是偏向锁、轻量级锁、重量级锁。

1)「重量级锁」

synchronized是依赖jvm实现同步的,他在同步代码块里和同步方法的原理有一些区别: 1、同步代码块:通过monitorenter和monitorexit指令实现的,每个对象都有一个监视器锁monitor,monitor被占用的时候就说明这个对象处于一个锁定状态,而monitorenter指令的作用就是去获取这个monitor的所有权,monitorexit指令就是去释放monitor。我来说一下他们的机制: monitorenter:每个monitor有个进入数,当它为0的时候表示没有线程在占用,当前线程就可以进入monitor,并将进入数设置为1;那如果当前线程已经拥有这个monitor,又重新进入的话,进入数就会+1,这就是锁的重入;如果monitor已经被其他线程占有,那么当前线程进入阻塞状态,等待monitor被释放,再去尝试获取。 monitorexit:首先必须要拥有这个monitor才能去执行monitorexit,执行后进入数-1,如果到0了就退出这个monitor,不再拥有。其他线程可以尝试去获取。 2、同步方法:方法常量池中会多一个ACC_SYNCHRONIZED标识,调用方法的调用指令会让线程去获取monitor,获取成功的话再继续执行方法,方法执行完毕后再释放monitor,同一个monitor同一时刻只能被一个线程拥有。 「总结」:二者都需要获取和释放monitor来实现线程同步,monitor的实现依赖于操作系统的mutex互斥锁,操作系统的线程之间的切换需要从用户态切换到内核态,开销比较大。

「2)轻量级锁」

相对于使用mutex的重量级锁来说的,他的实现主要是基于对象头的mark Word,线程进入同步方法或者同步代码块的时候,如果同步对象处于无锁状态(锁标志位为"01"状态,是否为偏向锁为"0),那么虚拟机会在栈帧里建立一个lock record(锁记录),获取锁的时候会把对象头的mark Word给拷贝过来,然后通过CAS操作把mark Word 更新为指向lock record的指针,更新成功后就拥有了该对象的锁,并把锁标志位改为00(轻量级锁)。 更新失败会检查mark Word是否是指向当前线程的,是的话表示当前线程已经有了这个对象的锁,然后进入代码块里执行。否则的话就表示已经被其他线程抢占了,然后就进入一个自旋,再次尝试cas更新指针。如果自旋结束还是没获取锁,那就膨胀为重量级锁,锁标志位状态值变为"10",Mark Word中储存就是指向monitor对象的指针,当前线程以及后面等待锁的线程也要进入阻塞状态。 释放锁就是通过cas将lock record里拷贝的markWord给替换回去,替换成功进入无锁状态;失败说明有其他线程尝试获取该锁(此时锁已膨胀),那就要在释放锁的同时,唤醒被挂起的线程。

「3)偏向锁」

如果说轻量级锁是在无竞争的情况下使用CAS操作区消除同步使用的互斥量,那么偏向锁就是把整个同步都消除掉. 检查Mark Word是否为可偏向锁的状态,即是否偏向锁即为1即表示支持可偏向锁,否则为0表示不支持可偏向锁。如果是可偏向锁,则检查Mark Word储存的线程ID是否为当前线程ID,如果是则执行同步块。如果检查到Mark Word的ID不是本线程的ID,则通过CAS操作去修改线程ID修改成本线程的ID,如果修改成功则执行同步代码块,否则执行步骤4。当拥有该锁的线程到达安全点之后,挂起这个线程,升级为轻量级锁。 释放: 偏向锁的释放采用了一种只有竞争才会释放锁的机制,线程是不会主动去释放偏向锁,需要等待其他线程来竞争。然后等待全局安全点(在这个是时间点上没有字节码正在执行)。暂停拥有偏向锁的线程,检查持有偏向锁的线程是否活着,如果不处于活动状态,则将对象头设置为无锁状态,否则设置为被锁定状态。如果锁对象处于无锁状态,则恢复到无锁状态(01),以允许其他线程竞争,如果锁对象处于锁定状态,则挂起持有偏向锁的线程,并将对象头Mark Word的锁记录指针改成当前线程的锁记录,锁升级为轻量级锁状态(00)。

比较

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-09-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 崩天的勾玉 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
60种常用可视化图表的使用场景——(上)
点阵图表 (Dot Matrix Chart) 以点为单位显示离散数据,每种颜色的点表示一个特定类别,并以矩阵形式组合在一起。
JOYCE_Leo16
2024/03/19
8520
60种常用可视化图表的使用场景——(上)
60种常用可视化图表的使用场景——(下)
这种图表使用同心圆网格来绘制条形图。每个圆圈表示一个数值刻度,而径向分隔线则用作区分不同类别或间隔(如果是直方图)。
JOYCE_Leo16
2024/03/19
6270
60种常用可视化图表的使用场景——(下)
【学习】15个最棒的JavaScript图形/图表库
阅读目录 D3.js — Data-Driven Documents Google Charts ChartJS Chartist.js n3-charts Ember Charts Smoothie Charts Chartkick ZingChart Highcharts JS Fusioncharts Flot amCharts EJS Chart uvCharts 几乎所有的控制面板都会用到图表,它们能够快速有效的展示复杂的统计。此外,一个好的图也可以提高你的网站的整体设计。 这篇文章为大家展示一些
小莹莹
2018/04/23
4.5K0
【学习】15个最棒的JavaScript图形/图表库
【干货】数据可视化分析工具大集合
Excel Excel作为一个入门级工具,是快速分析数据的理想工具,也能创建供内部使用的数据图,但是Excel在颜色、线条和样式上课选择的范围有限,这也意味着用Excel很难制作出能符合专业出版物和网
钱塘数据
2018/03/05
2.6K0
【干货】数据可视化分析工具大集合
20个免费和开源数据可视化工具
数据可视化正在帮助全球公司识别模式,预测结果并提高业务回报。可视化是数据分析的一个重要方面。简而言之,数据可视化以可视格式传达表格或空间数据的结果。图像有能力吸引注意力并清晰地传达想法。这有助于决策制定并推动改进行动。
February
2018/11/19
14.7K0
可视化图表入门教程
数据可视化,即通过图表形式展现数据,帮助我们快速、准确理解信息。好的可视化会“讲故事”,能向我们揭示数据背后的规律。
iCDO互联网数据官
2018/07/27
2.6K0
可视化图表入门教程
收藏!52个实用的数据可视化工具!
从数据获得信息的最佳方式之一是,通过视觉化方式,快速抓住要点信息。另外,通过视觉化呈现数据,也揭示了令人惊奇的模式和观察结果,是不可能通过简单统计就能显而易见看到的模式和结论。
CDA数据分析师
2021/03/11
4.7K0
收藏!52个实用的数据可视化工具!
吐血整理:24种可视化图表优缺点对比,一图看懂!
安德鲁·阿伯拉(Andrew Abela)制作的《这份指南》(This Guide)是思考图表类型的一个很好的起点,但不要把它用作决策引擎。并不是人人都同意他对图表类型的组织方式,层级结构也并未包含所有有效的图表类型。
CDA数据分析师
2020/09/22
5.2K0
吐血整理:24种可视化图表优缺点对比,一图看懂!
九大数据可视化利器,你有在使用吗?
可视化信息以易于阅读的视觉化内容正在被越来越多的人所青睐。可视化形式呈现信息的需求也随之增加,因此近年来涌现出了许多数据可视化工具。对于不熟悉数据可视化领域的人来说,最好的方法是尝试一些现成的解决方案来快速制作标准化的图表。对于拥有更多技术专长、经验丰富的用户,最好的办法是使用更灵活的库。 下面与大家分享九大数据可视化库,希望你可以找到最适合的一款。
LiveEdu
2018/05/21
4.2K0
九大数据可视化利器,你有在使用吗?
50种制作图表JS库
在很多项目中都会有在前端展现数据图表的需求,而在开发过程中,开发者往往会使用一些JavaScript库,从而更有效地达到想要的目标。最近,TechSlide上的一篇文章总结了50种用于展现图表的JavaScript库,并对每种库做了简要的说明。这对于想要选择合适JavaScript库的开发者很有参考意义。
阳光岛主
2019/02/19
4.7K0
10种免费的工具让你快速的、高效的使用数据可视化
是的,我们有数据,并有了数据的洞察,然后呢?显然,下一步将是与人们交流这些发现,以便他们采取必要的行动。最有效的数据交流方式之一就是讲故事。但是要成为有效的讲述者,我们需要简化事情,而不是使事情复杂化,这样使得分析的真正本质不会丢失。
AI研习社
2019/07/30
3.3K0
10种免费的工具让你快速的、高效的使用数据可视化
可视化分析工具大集合,让数据美如画
导读:大数据时代,得数据者得天下。巧妇难为无米炊,拥有数据却不知道如何利用,就不能体现数据的价值。而数据可视化作为处理数据的重要步骤,一直被广泛应用。冷冰冰的数据,经过可视化技术的加工,便酒曲入瓮般幻
钱塘数据
2018/03/06
2.5K0
可视化分析工具大集合,让数据美如画
只会Excel怎么够?这49款数据可视化神器推荐收藏
新媒体管家 大数据时代,你还在拿Excel做的图表提交给Boss看吗?有没有想过用其他更炫酷的工具让Boss眼前一亮呢?为了让大家了解如何选择适合的数据可视化产品,小编整理了50款可以用来做数据可视化
钱塘数据
2018/03/06
3.9K0
只会Excel怎么够?这49款数据可视化神器推荐收藏
55款大数据分析神器:你还在用Excel?
来源:DataCastle数据城堡(ID:DataCastle2016)、大数据分析和人工智能(ID:datakong)
CDA数据分析师
2019/11/12
1.3K0
55款大数据分析神器:你还在用Excel?
推荐30款最佳的数据可视化工具
各个互联网公司通过大量的用户数据、信息进行统计分析,而这些大量繁杂的数据在经过可视化工具处理后,就能以图形化的形式展现在用户面前,清晰直观。随着各种数据的增加,这种可视化工具越来越得到开发者们的欢迎。   下面推荐30款可视化工具供大家选择和使用。 1.iCharts iCharts 提供了一个用于创建并呈现引人注目图表的托管解决方案。有许多不同种类的图表可供选择,每种类型都完全可定制,以适合网站的主题。iCharts 有交互元素,可以从Google Doc、Excel 表单和其他来源中获取
小莹莹
2018/04/18
10.7K0
推荐30款最佳的数据可视化工具
如何成为数据分析师系列(一):可视化图表初阶
数据可视化-通过图表形式展现数据,帮助用户快速、准确理解信息。准确、快速是可视化的关键,好的可视化会“讲故事”,能向我们揭示数据背后的规律。对于可视化,有一个常见误区:分析师追求过于复杂的图表,反而使得业务人员难以理解。其实越简单的图表,越容易被理解,而快速易懂地理解数据,正是可视化最重要的目标。
数据森麟
2019/09/27
8790
如何成为数据分析师系列(一):可视化图表初阶
【数据可视化】Echarts最常用图表
在上一篇博客中提到了【数据可视化】数据可视化入门前的了解,这次来看看Echarts最常用图表有哪些,和作用是什么?
zxctscl
2024/03/16
8210
【数据可视化】Echarts最常用图表
2018年全球最受欢迎的30款数据可视化工具
RAWGraphs是一个在线的开源工具和数据可视化框架,用来处理Excel表中的数据。你只需将数据导入到RAWGraphs中,设计你想要的图表,然后将其导出为SVG格式或PNG格式的图片。此外,上传至RAWGraphs的数据只会在web端在线进行处理,保证了数据的安全性。
iCDO互联网数据官
2019/10/08
4.5K0
2018年全球最受欢迎的30款数据可视化工具
【数据可视化】让效率“爆表”的49个数据可视化工具
工欲善其事,必先利其器。好的工具可以大大提升你的工作效率,并获得身边人的羡慕和赞赏。今天,我们就来向小伙伴们分享一大波非常实用的工具,武装你的大脑。 ▲图表类 iCharts 简介:各种主题的开放图
陆勤_数据人网
2018/02/26
3.1K0
【数据可视化】让效率“爆表”的49个数据可视化工具
十款常用的数据展示(可视化)软件介绍,操作便捷,功能强大
大数据的出现使数据可视化可谓发挥到了极致。数据可视化主要是为了直观,实时地查看数据变化并做出第一反馈。正因为人们分析了大量数据,所以可视化的数据展示可以使用户很直接的了解并感受到大数据带来的震撼。
数据前沿
2020/06/19
4.4K0
十款常用的数据展示(可视化)软件介绍,操作便捷,功能强大
推荐阅读
相关推荐
60种常用可视化图表的使用场景——(上)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档