Synchronize 底层实现原理

1 、加锁实现原理


public class SynchronizedTest {public void get(){synchronized (this){        // 这个是同步代码块System.out.println("你好呀");}}public synchronized void f(){    //这个是同步方法System.out.println("Hello world");}public static void main(String[] args) {}}

反编译
在这里插入图片描述
monitorenter:代表 监视器入口,获取锁;
monitorexit:代表监视器出口,释放锁;
monitorexit:第二次monitorexit,代表 发生异常,释放锁;

2、底层实现ObjectMonitor

2.1 ObjectMonitor属性

sychronized 底层实现是ObjectMonitor
ObjectMonitor中有两个队列,_WaitSet 和 _EntryList,用来保存ObjectWaiter对象列表( 每个等待锁的线程都会被封装成ObjectWaiter对象)。
_owner指向持有ObjectMonitor对象的线程,当多个线程同时访问一段同步代码时,首先会进入 _EntryList 集合,当线程获取到对象的monitor后,进入 _Owner区域,并把monitor中的owner变量设置为当前线程,同时monitor中的计数器count加1。
若线程调用 wait() 方法,将释放当前持有的monitor,owner变量恢复为null,count自减1,同时该线程进入 WaitSe t集合中等待被唤醒。若当前线程执行完毕也将释放monitor(锁)并复位变量的值,以便其他线程进入获取monitor(锁)[notify/notifyAll/wait等方法存在于顶级对象Object中的原因]

ObjectMonitor() {_header       = NULL;// 存储着MarkWord_count        = 0; // 竞争锁的线程个数_waiters      = 0, // wait的线程个数_recursions   = 0; //标识当前synchronized 锁重入的次数_object       = NULL;_owner        = NULL; //持有锁的线程_WaitSet      = NULL; // 处于wait状态的线程,会被加入到_WaitSet_WaitSetLock  = 0 ;_Responsible  = NULL ;_succ         = NULL ;_cxq          = NULL ; //获取锁资源失败后,线程要放到当前的单向链表中FreeNext      = NULL ;_EntryList    = NULL ; // _cxq以及被唤醒的WaitSet中的线程,在一定机制下,会放到EntryList_SpinFreq     = 0 ;_SpinClock    = 0 ;OwnerIsThread = 0 ;}

2.2 加锁

在这里插入图片描述

2.3 释放锁

在这里插入图片描述

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

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

相关文章

DC-DC直流升压线性可调电源模块电压控制输出0-50V/0-80V/0-100V/0-200V/0-250V/0-300V/0-500V/0-1000V

特点 效率高达 75%以上1*2英寸标准封装单电压输出可直接焊在PCB 上工作温度: -40℃~75℃阻燃封装,满足UL94-V0 要求温度特性好电压控制输出,输出电压随控制电压线性变化 应用 GRB 系列模块电源是一种DC-DC升压变换器。该模块电源的输入电压分为:4.5~9V、…

转载 | 大佬3万字深度分析:2024全球游戏业正在遭遇什么困境?

2022年,游戏业当时的裁员人数达到了破纪录的8500人,2023年这个数字几乎增长了20%,然后在2024开年的两个月,就已经有7800人丢掉了工作。伴随着这些裁员的,是大量表现不及预期的或者完全失败的游戏,还有更多处…

Linux(八) 进程间通信

目录 一、什么进程间通信 1.1 进程间通信的目的 1.2 进程间通信的概念 1.3 进程间通信的分类 二、 管道/匿名管道(pipe) 2.1 什么是管道 2.2 管道的创建 2.3 站在文件描述符角度-深度理解管道 2.4 站在内核角度-管道本质 2.5 匿名管道的读写 2.6 匿名管道的读写规则 …

运动耳机怎么选?五款新手必买的运动耳机盘点

运动耳机是专为运动爱好者设计的耳机,轻巧便携,佩戴稳固。无论你在跑步、健身还是骑行,它都能为你带来优质的音乐体验。那如何选择一款合适的运动耳机呢?这里,我结合自己和身边朋友平时选购经验,整理了一些…

编程实战:自己编写HTTP服务器(系列5:执行后台shell命令)

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 系列入口:编程实战…

单片机负电压

在电子电路中我们常常需要使用负电压,比如说我们在使用运放的时候常常需要建立一个负电压。下面就简单的以正5V电压到负电压5V为例说一下它的电路。 通常需要使用负电压时一般会选择使用专用的负压产生芯片,但这些芯片都比较贵,比如电荷泵原理…

P1229 遍历问题

题目描述 我们都很熟悉二叉树的前序、中序、后序遍历,在数据结构中常提出这样的问题:已知一棵二叉树的前序和中序遍历,求它的后序遍历,相应的,已知一棵二叉树的后序遍历和中序遍历序列你也能求出它的前序遍历。然而给…

剪辑师创作必备声音素材,BGM背景音效素材合集1万款

一、素材描述 本套音效包含了全面丰富的声音效果,如动物、运输、人群、天气、航空、军事、Foley声音等,以及世界各地的场景声效等,可能是同类音效中最为全面的,共由三套声音素材组合而成,1、熊猫背景音乐3800首&#…

宁静致远(“静”)

宁静致远是一个成语,读音为nng jng zh yuǎn,意思是只有心境平稳沉着、专心致志,才能厚积薄发、 有所作为。出自《淮南子:主术训》。 出处 宁静致远张铭篆刻 此句最早出自西汉初年道家刘安的《淮南子:主术训》,蜀汉丞相诸葛亮的…

5年增100倍6秒卖1瓶酒,酣客的“FFC模式”是什么

酣客酱酒销售模式,白酒FFC模式,白酒新零售模式设计 坐标:厦门,我是易创客肖琳 深耕社交新零售行业10年,主要提供新零售系统工具及顶层商业模式设计、全案策划运营陪跑等。 不知从何时起,营销圈开始有这么一…

Verilog 实现 i2c 协议

在时钟(SCL)为高电平的时候,数据总线(SDA)必须保持稳定,所以数据总线(SDA)在时钟(SCL)为低电平的时候才能改变。 在时钟(SCL)为高电平…

诸葛智能携手五大银行,以数据驱动的营销中台带来可预见增长

对于银行来说,客户是赖以生存的基础,也是保持活力的关键。尤其是大数据、人工智能等新兴技术的推动下,通过数据赋能产品升级和服务创新,深挖客户潜能,更是助推银行快步迈入高质量发展的新阶段。 在银行加速拥抱新质生…

文档分类DPCNN简介(pytorch实现)

文档分类DPCNN简介 DPCNN简介 模型结构区域嵌入等长卷积1/2池化DPCNN模型代码实现 DPCNN简介 论文中提出了一种基于 word-level 级别的网络-DPCNN,由于 TextCNN 不能通过卷积获得文本的长距离依赖关系,而论文中 DPCNN 通过不断加深网络,可以…

ATA-2021B高压放大器在光纤超声传感器中的应用

实验名称:超声传感性能研究 测试目的: 光纤马赫-曾德尔干涉仪是一种灵敏度高、结构灵活的传感结构。当在MZI上施加超声波信号时,会影响所涉及的干涉光之间的光程差,并导致干涉光谱的漂移。由于模式耦合是基于MZI的光纤传感器的关键…

脑中风也会出现眩晕?快速识别中风,一定要牢记这些!

眩晕是许多人都会经历的不适感,发作时仿佛整个世界都在旋转,可能还伴随着站立不稳、脚步虚浮、恶心等症状。然而,你可能不知道的是,这些症状在某些情况下可能是脑中风的前兆。如果不及时关注并采取相应措施,一旦发展为…

【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置

本节博客主要是通过“在排序数组中查找元素的第一个和最后一个位置”总结关于二分算法的左右界代码模板,有需要借鉴即可。 目录 1.题目2.二分边界算法2.1查找区间左端点2.1.1循环条件2.1.2求中点的操作2.1.3总结 2.2查找区间右端点2.1.1循环条件2.1.2求中点的操作2.…

O2OA平台流程催办怎么做

O2OA平台设计了灵活的消息提醒数据交互方式,开发者可以根据自己的需要,来消费消息提醒数据,也可以将消息提醒数据接入到Kafka消息中间件来实现消息的准实时提醒。本篇主要介绍如何在O2OA服务器中设置流程的催办提醒消息。 催办提醒服务&#…

centos无法联网解决方案(9步完成

1.打开终端,输入 su - root 进入到管理员模式(-的前后都有空格哈) 切换后,显示的就是root... 2.. ,输入命令ip addr 2. 切换当前目录 cd /etc/sysconfig/network-scripts/ 3.输入命令,打开文件 vi /etc…

一.常见算法--动态规划

(1)0-1背包问题 问题描述: 0-1背包问题的描述:在n种物品中选择1个或0个第i种物品,装入背包容量为m的背包,使得背包价值达到最大。 思路与关键点: 用到了max函数,用于返回两个数之中…

为何Linux成为你不可或缺的技能

在数字化飞速发展的今天,无论你是IT行业的精英,还是其他领域的专业人士,掌握Linux都已经成为一项至关重要的技能。那么,为什么一定要学会Linux呢?以下文章仅供参考 1. 开源的力量:无限的可能性 Linux是一…