Synchronized实现原理

Synchronized 三种锁类型(本质上都是依赖对象来锁)

this锁:当前实例锁,比如在方法里面通过锁住this
class锁:类对象锁
Object锁:对象实例锁
前面我们提到synchronized是依赖于对象的对象头中的Monitor来实现的锁功能,而从官方的虚拟机规范文档上可以看到Java中的synchronized同步的确是基于Monitor(管程)对象来实现的,
获取锁:进入管程对象(显式型:monitorenter指令),
释放锁:退出管程对象(显式型:monitorexit指令),重量级锁也就是通常说synchronized的对象锁,锁标识位为10,其中【指针指向的是monitor对象】(也称为管程或监视器锁)的起始地址。
每个对象都存在着一个 monitor 与之关联,对象与其 monitor 之间的关系有存在多种实现方式,如monitor可以与对象一起创建销毁或当线
程试图获取对象锁时自动生成,但当一个monitor被某个线程持有后,它便处于【锁定状态】在Java虚拟机(HotSpot)中,monitor是由【ObjectMonitor】实现的,其主要数据结构如下
ObjectMonitor() {_count        = 0; 			//记录个数,重入会加1_owner        = NULL;  		//获得ObjectMonitor对象的【线程】或基础锁_waiters      = 0, 			//等待线程数_WaitSet      = NULL; 		//处于【wait状态】的线程,会被加入到_WaitSet,这里是先拿到了锁然后调用了wait方法导致释放锁。_EntryList    = NULL; 		//处于【等待锁block状态】的线程,会被加入到该列表
}monitor:monitor存在于堆中,什么是Monitor?我们可以把它理解为一个【同步工具】,也可以描述为一种同步机制,它通常被描述为一个对象。
与一切皆对象一样,所有的【Java对象是天生的Monitor】,每一个Java对象都有成为Monitor的潜质,因为在Java的设计中 ,每一个Java对象
自打娘胎里出来就带了一把看不见的锁,它叫做内部锁或者Monitor锁。

在这里插入图片描述

ObjectMonitor中有两个队列,
_WaitSet 和 _EntryList,用来保存ObjectWaiter对象列表( 每个等待锁的线程都会被封装成ObjectWaiter对象),
_owner指向持有ObjectMonitor对象的线程,当多个线程同时访问一段同步代码时,
1、首先会进入 _EntryList 集合,
2、当线程获取到对象的monitor 后进入 _Owner 区域并把monitor中的owner变量设置为当前线程,同时monitor中的计数器count加13、若线程调用 wait() 方法,将释放当前持有的monitor,owner变量恢复为null,count自减1,同时该线程进入WaitSet集合中等待被唤醒。
4、若当前线程执行完毕也将释放monitor()并复位变量的值,以便其他线程进入获取monitor()。如下图所示:由此看来,monitor对象存在于每个Java对象的对象头中markword内(存储的指针的指向)synchronized关键字便是通过这种方式获取锁的,也是为什么【Java中任意对象可以作为锁】的原因,
同时也是notify/notifyAll/wait等【方法存在于顶级对象Object】中的原因

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

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

相关文章

matlab 多自由度的车辆垂向振动模型 车辆平稳性研究

1、内容简介 略 17-可以交流、咨询、答疑 多自由度的车辆垂向振动模型 多自由度的车辆垂向振动模型,包含四分之一车体模型、半车模型和整车模型 垂向振动模型、四分之一车体模型、半车模型和整车模型 2、内容说明 略 3、仿真分析 略 4、参考论文 略 链接&…

【Linux网络】ssh服务与配置,实现安全的密钥对免密登录

目录 一、SSH基础 1、什么是ssh服务器 2、对比一下ssh协议与telnet协议 3、常见的底层为ssh协议的软件: 4、拓展 二、SSH软件学习 1、ssh服务软件学习 2、sshd公钥传输的原理: 3、ssh命令学习: 4、学习解读sshd服务配置文件&#x…

Python 爬虫之scrapy 库

文章目录 总的介绍相关模块 总的介绍 Scrapy是一个用于爬取网站数据的开源Python框架。它提供了一套强大而灵活的工具,用于从网站上提取所需的数据。Scrapy是基于Twisted异步网络库构建的,因此可以高效地处理大量的并发请求。以下是Scrapy的一些主要特点…

react类式组件的生命周期和useEffect实现函数组件生命周期

概念 生命周期是一个组件丛创建,渲染,更新,卸载的过程,无论是vue还是react都具有这个设计概念,也是开发者必须熟练运用的,特别是业务开发,不同的生命周期做不同的事是很重要的. ....多说两句心得,本人是先接触vue的,无论是vue2还是vue3的生命周期,在理解和学习上都会比react更…

【Python3】【力扣题】263. 丑数

【力扣题】题目描述: 此题:正整数n,能被2或3或5整除,且不断除以2或3或5最终的数是1。 【Python3】代码: 1、解题思路:递归。 知识点:递归:函数中调用函数自身(必须有退…

Java实现身份证号校验,最后一位校验码校验

中国居民身份证号码编码规则 第一、二位表示省(自治区、直辖市、特别行政区)。 第三、四位表示市(地级市、自治州、盟及国家直辖市所属市辖区和县的汇总码)。其中,01-20,51-70表示省直辖市;21-5…

ChatGPT只算L1阶段,谷歌提出AGI完整路线图

按照谷歌这个标准来看,大多数已有AI产品其实都分别进入了不同的AGI阶段,但只仅限于在技能水平上——要谈及通用性,目前只有ChatGPT等模型完全合格。 AGI应该如何发展、最终呈什么样子? 现在,业内第一个标准率先发布&a…

智能巡检软件哪个好?中小企业如何提升工作效率与质量?

在当今数字化、智能化的时代,智能巡检软件作为一种高效的工具,已经在各行各业得到了广泛的应用。它利用物联网、大数据、人工智能等技术,为巡检工作提供了全面的解决方案,帮助企业实现数据化、智能化管理,提高工作效率…

SPI协议详解

SPI协议详解 文章目录 SPI协议详解前言一、SPI是什么?二、通信原理SPI 通信的 4 种工作模式 总结 前言 好久没写这种协议了,最近正好需要用到,便详细的复习一下。 一、SPI是什么? SPI是串行外设接口(Serial Periphe…

通过Workstation工具制作CentOS8虚拟机模板

通过Workstation工具制作CentOS8虚拟机模板 1. 需求说明2. 安装模板虚拟机3. 配置模板虚拟机 1. 需求说明 说明:在做集群实验过程中,需要创建多台虚拟机,如果逐台安装虚拟机,很消耗时间,所以最简洁的办法就是通过模板克…

数据结构 | 栈的实现

数据结构 | 栈的实现 文章目录 数据结构 | 栈的实现栈的概念及结构栈的实现 Stack.h初始化栈入栈出栈获取栈顶元素获取栈中有效元素个数检测栈是否为空销毁栈 Stack.c 栈的概念及结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。…

【Python】【应用】Python应用之一行命令搭建http、ftp服务器

🐚作者简介:花神庙码农(专注于Linux、WLAN、TCP/IP、Python等技术方向)🐳博客主页:花神庙码农 ,地址:https://blog.csdn.net/qxhgd🌐系列专栏:Python应用&…