Synchronized关键字的底层原理

Synchronized实现

Synchronized创建的时候一个互斥的对象锁,每次只有一个线程可以获取该锁。

其底层主要是基于Monitor实现的,在对象的对象头中存储了MarkWord存储的就是Monitor的地址。

 对象的内存结构

对象在内存中存储主要分为三个部分:对象头,实例数据,对齐填充。 

对象头:MarkWord用于存储锁的信息,Klass Word用于存储对象的类型。

  • 无锁状态:hashcode(25位)+ 对象分代年龄(4位,不是重点)+ 偏向锁标识(1位)+ 锁标识(2位)
  • 偏向锁:thread(23位,线程id)+ 偏向时间戳(2位,不是重点)+ 偏向锁标识(1位)+ 锁标识(2位)
  • 轻量级锁:对应线程的栈中指向锁记录的指针。(30位)
  • 重量级锁:对应monitor的地址。(30位)

实例数据:用于存储对象中成员变量的信息。 

对齐填充:不是重点,主要是为了保证长度是8的整数倍。

Monitor(重量级锁)

其中包括三个部分:waitSet,entryList,owner。

owner:存储当前获得锁的线程的id。

enrtyList:存储没有获取到锁的线程id的集合,这些线程处于堵塞状态。

waitList:存储处于等待的线程的集合,通常这些线程调用了wait方法。

当线程要获取锁的时候会先去owner判断是否有线程存在,如果没有的话,直接获取锁并将线程id写入owner,反之写入entryList。

轻量级锁

重量级锁主要使用在线程竞争的时候,且重量级锁涉及进程的上下文切换,效率比较低下,在没有线程竞争且不同线程交替执行的时候,推荐使用轻量级锁。

上锁

在线程栈中创建一个锁记录,锁记录中包含 锁记录地址和指向对象的指针两个部分。通过CAS指令将锁记录地址和MarkWord中的地址进行交换

1.如果对象处于无锁状态则说明获取锁成功,且获取的是轻量级锁。

2.如果对象已经有锁了,这此时就是锁的重入,会继续创建锁记录,且也会进行做CAS指令,但是

 记录锁的地址为null。起到锁重入计数效果。

3.如果CAS指令失败了,则会直接使用重量级锁。

解锁

1.遍历线程栈,找到对象指针指向锁对象的锁记录。

2.如果锁记录中的MarkWord的值为null,说明这是一次锁重入操作,直接将锁记录中的指向对象的地址设置为null。

3.如果锁记录中的MarkWord的值不为null,我们就通过CAS指令将锁对象中的MarkWord恢复成无锁状态。

偏向锁

类是轻量级锁,但是在做锁的重入的时候不会使用CAS指令,而是直接判断thread的id是否相同,相同就表示没有竞争。减少了CAS指令操作。适合使用在长时间只有一个线程使用锁

所有锁一但发生了冲突都会变成重量级锁。 

三种锁的使用场景

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

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

相关文章

天翼云:“百万IOPS”助推政企上云

随着数字化转型的加速,越来越多的企业选择了业务上云。众所周知,不论是政企关键/核心业务中的大型数据库、NoSQL、AI训练,还是互联网业务中的游戏、渲染等场景,对数据读写IOPS和时延有极高的要求。作为全球领先的云服务商&#xf…

第二证券:国际金价创新高 国内锂电企业有望加速出海

12月首个交易日,两市股指盘中弱势下探,午后止跌回升,沪指、创业板指翻红,北证50指数再度跳水。到收盘,沪指微涨0.07%报3031.64点,深成指跌0.07%报9720.57点,创业板指涨0.19%报1926.28点&#xf…

SWD和JTAG

1、调试接口概念 1)SWD:Serial Wire Debug,代表串行线调试,是ARM设计的协议,用于对其微控制器进行编程和调试。 SWD 引脚: SWDIO–串行数据线,用于数据的读出和写入SWDCLK–串行时钟线&#…

微积分-圆的面积和周长(1)

微积分 历史 先有牛顿后有天,创世之后再造仙。作为近代物理学的开山鼻祖,牛顿的贡献怎么评价都不为过。而微积分是首先被牛顿搞出来的也已经是公认的事实,牛顿在研究物理问题的时候顺带做出来的,不知是舍不得发表还是不屑于发表…

使用gdb调试正在运行的程序

写一个一秒打印一个数的c程序&#xff0c;并编译运行。 #include<unistd.h> #include<stdio.h> int main(int argc,char **argv){int i0;while(1){sleep(1);i;printf("%d\n",i);}return 0; }vim loop.c gcc loop.c -o loop ./loop 查看该进程的进程号。…

基于粒子群算法思想的电动汽车充放电策略-V2G模型-程序代码!

电动汽车充放电对电网的安全稳定带来影响&#xff0c;合理规划电动汽车充放电时间和策略是目前的研究热点。本程序仿真了汽车有序充电和无需充电两种案例&#xff0c;利用电动汽车合理消纳新能源电量&#xff0c;利用粒子群算法思想来求解模型&#xff0c;程序中案例丰富&#…

EasyRecovery2024破解补丁安装包网盘下载

Ontrack EasyRecovery2024是一款功能强大的数据恢复软件&#xff0c;它可以帮助用户从各种存储设备中恢复丢失或删除的数据。它支持多种文件系统和文件类型&#xff0c;可以恢复包括照片、视频、音频、文档、电子邮件和归档文件等不同类型的数据。 Ontrack EasyRecovery 是一款…

matplotlib与opencv图像读取与显示的问题

个人博客:Sekyoro的博客小屋 个人网站:Proanimer的个人网站 最近在用opencv和matplotlib展示图片,但是遇到了一些问题,这里展开说说 首先需要明确的是,opencv和matplotlib读取图片都是通道在最后,而前者默认可见光图像是BGR,后者是RGB.此外还有PIL以及imageio等读取图像的工具…

EasyRecovery14破解版官方软件安装包下载

Ontrack EasyRecovery 是一款功能强大的数据恢复软件&#xff0c;它可以帮助用户从各种存储设备中恢复丢失或删除的数据。它支持多种文件系统和文件类型&#xff0c;可以恢复包括照片、视频、音频、文档、电子邮件和归档文件等不同类型的数据。 Ontrack EasyRecovery 是一款非常…

JAVA毕业设计113—基于Java+Springboot+Vue的体育馆预约系统(源代码+数据库+12000字论文)

基于JavaSpringbootVue的体育馆预约系统(源代码数据库12000字论文)113 一、系统介绍 本项目前后端分离&#xff0c;本系统分为管理员、用户两种角色 用户角色包含以下功能&#xff1a; 注册、登录、场地(查看/预订/收藏/退订)、在线论坛、公告查看、我的预订管理、我的收藏…

今日实施|解读新国标对数据库审计的能力要求

数据库审计是数据安全建设不可或缺的技术工具之一&#xff0c;无论是国家级的法律或标准&#xff0c;还是等保以及行业级的安全标准均对使用数据库审计有明确要求。据相关数据统计显示&#xff0c;数据库审计产品的市场需求已占据中国数据库安全市场容量的6成以上。 12月1日&am…

易点易动二维码巡检方案:提升企业巡检效率的智慧选择

在当今科技发达的时代&#xff0c;传统的纸质设备巡检方式已经无法满足企业管理的需求。纸质巡检方式存在诸多弊端&#xff0c;如巡检效率低、数据管理困难等问题。然而&#xff0c;随着易点易动二维码巡检方案的出现&#xff0c;企业可以迎来一种全新的巡检方式&#xff0c;极…