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.hqwc.cn/news/706416.html

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

相关文章

VBA在Excel中部首组查字法的应用

VBA在Excel中部首组查字法的应用 文章目录 前言一、网站截图二、操作思路三、代码1.创建数据发送及返回方法2.创建截取字符串中的数值的方法3.获取部首对应的编码4.获取特定部首的汉字运行效果截图前言 使用汉语字典查生字、生词,多用拼音查字法和部首查字法。以前都是用纸质…

【前端】TypeScript--未整理

概念 安装 npm install -g typescript 检查版本 tsc -v tsc 类型

代码随想录——二叉树的最小深度(Leetcode111)

题目链接 层序遍历 遍历整棵树,当找到一个叶子节点时,直接返回这个叶子节点的深度。 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNod…

创新实训2024.05.12日志:建立易学知识库

1. 部署向量知识库到生产机 1.1. 基本环境配置 生产机上的环境还没有配好,这里我记录下需要配置的环境。 python 3.11.8 首先python环境最好选用3.11(准确来说支持3.8-3.11的任何release),我选择了python3.11.8 Python Release Python 3.…

vue框架学习--表单校验

在使用 Element UI(一个常见的 Vue UI 组件库),要给 添加表单验证,Element UI 的表单验证通常通过 Form 和 FormItem 组件以及它们的 rules 属性来实现。下面是一个例子,展示如何给联系人字段添加表单验证:…

C语言实现心形代码(静态效果+动态效果)

静态心形代码 用C代码在控制台输出一个由字符(在这个例子中是小写字母’v’)组成的心形形状。步骤如下:(有完整实现代码) 变量声明: int i, j, k, l, m; char c v;这里声明了五个整数变量(i…

全新多语言海外抢单刷单系统源码 订单自动匹配 支持分组 代理后台

安装教程 测试环境:Nginx PHP7.0 MySQL5.6 config/database 修改数据库 设置运行目录public 伪静态thinkphp 后台登录地址:/admin 账号admin 密码admin123 前端出现报错 删除runtime文件夹得缓存文件即可 源码免费下载地址抄笔记 (chaobiji.cn)

ES之道:IK分词器的魔法般变身

欢迎来到我的博客,代码的世界里,每一行都是一个故事 ES之道:IK分词器的魔法般变身 前言IK分词器简介IK分词器原理创建索引和配置IK分词器实战(docker搭建的Es)下载ik插件创建一个ik分词器的索引如果希望将原来的索引覆盖重新索引数据删除旧索…

攻克河南市政给排水乙级资质申办难点,企业需做好哪些准备?

为了攻克河南市政给排水乙级资质申办的难点,企业需要做好以下准备: 深入理解资质标准: 仔细研读和深入理解市政给排水乙级资质的相关标准和要求,确保对所需的人员配备、技术能力、业绩证明、注册资金等方面有清晰的认识。人员配备…

【Linux C】目录相关的操作函数 mkdir、rmdir、opendir、readdir、closedir、getcwd、chdir

🔥博客简介: 开了几个专栏,结合工作中所用到的,针对嵌入式开发和音视频开发,做一下记录总结和分享。 🚀系列专栏: C语言、Linux、rtos、嵌入式开发、流媒体、数据结构、网络协议、开源库、CMak…

分布式搜索——ElasticSeach简介

一般都用数据库存储数据,然后对数据库进行查询获取数据,但是当数据量很大时,查询效率就会很慢(具体下面会讲到),所以这种情况下就会使用到ElasticSeach ElasticSeach的基本介绍 ElasticSeach是一 款非常强…

2024 年第四届长三角高校数学建模竞赛C题

赛道 C:汽后配件需求预测问题 在汽后行业的供应链管理中,精准的需求预测是后续管理及决策的基础。各个汽后配件即为一个库存单位(SKU,Stock Keeping Unit),如果可以准确预知未来对于各个配件的市场需求&am…