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 释放锁

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据生命周期管理:从提取到治理再到安全保障的全面策略

在大数据的时代背景下,数据已经成为企业运营不可或缺的资源。然而,数据的管理并非易事,特别是在数据的整个生命周期中——从数据的提取、治理到安全保障,每一个环节都至关重要。本文将探讨如何制定一个全面的数据生命周期管理策略…

单片机开发板上外设资源讲解

单片机开发电路板上简单外设 开发板上各基础外设LED灯按键:数码管介绍液晶屏矩阵键盘扫描的概念LED点阵屏实时时钟蜂鸣器存储器 温度传感器&单总线 开发板上各基础外设 LED灯 中文名:发光二极管 外文名:Light Emitting Diode 简称&…

elasticsearch(下载安装、基本操作、查询、聚合、SpringData-Elasticsearch)

文章目录 1. 了解搜索技术1.1. 什么是搜索1.2. 新业务需求1.3. 搜索引擎1.4. 倒排索引(Inverted index)1.5. 认识lucene1.6. 什么是全文检索 2.下载安装2.1. elastic2.2 下载2.2.1 elasticsearch2.2.2 kibana地址2.2.3 ik中文分词器地址 2.3 安装elasticsearch2.3.1 安装elasti…

AI Agent LangChain使用方法记录

B站教程OpenAI官网获取密钥: OPENAI官网获取KEY 报错“Did not find openai_api_key, please add an environment variable OPENAI_API_KEY”

智能网红主播直播手机:助您轻松卖货、卖团购卷、拓客利器!

在当下快速发展的电商行业中,直播销售已经成为无可忽视的一大趋势。智能网红主播直播手机的出现,让人们无需拥有专业设备和经验,便可轻松参与直播销售,享受销售乐趣。本文将介绍智能网红主播直播手机的操作简单、易上手以及其在卖…

JSON格式化输出html——数组+对象+JSON字符串+汉字——基础积累——@pgrabovets/json-view

昨天写了一篇关于JSON格式化输出到页面上——数组对象JSON字符串汉字——基础积累的文章,效果是可以实现的 但是如果要实现右侧部分的展开/折叠,则可以使用到下面的插件了pgrabovets/json-view github链接:https://github.com/pgrabovets/j…

【C语言】水仙花数

问题 水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant, PPDI)、自恋数、自幂数或阿姆斯壮数数(Armstrong number)。 它是指一个n位数(n≥3)…

什么样的开放式耳机好用舒服?五款高人气质量绝佳产品力荐!

​随着人们越来越注重个人的身体健康问题,掀起了一股运动浪潮,现在大家都会喜欢跑跑步,运动一下使自己的身体更好,那么在运动时候如果能有音乐听的话,人们的运动状态就能达到更好的水平。鉴于传统入耳式耳机给用户带来…

特征模态分解(FMD):一种小众而又新颖的分解方法

​ 声明:文章是从本人公众号中复制而来,因此,想最新最快了解各类智能优化算法及其改进的朋友,可关注我的公众号:强盛机器学习,不定期会有很多免费代码分享~ 今天为大家介绍一个小众而又新颖的信号分…

【全开源】Java同城信息付费系统家政服务房屋租赁房屋买卖房屋装修信息发布平台小程序APP公众号源码

同城信息付费系统:家政服务的新篇章 在快节奏的现代生活中,家政服务已成为许多家庭不可或缺的一部分。然而,如何快速、准确地找到合适、可靠的家政服务人员,一直是困扰着许多家庭的问题。为了解决这一难题,我们推出了…

JVS物联网、无忧企业文档、规则引擎5.14功能新增说明

项目介绍 JVS是企业级数字化服务构建的基础脚手架,主要解决企业信息化项目交付难、实施效率低、开发成本高的问题,采用微服务配置化的方式,提供了 低代码数据分析物联网的核心能力产品,并构建了协同办公、企业常用的管理工具等&am…

谷歌 I/O 2024大会全面硬钢OpenAI;腾讯宣布旗下的混元文生图大模型;阿里巴巴技术下的AI自动视频剪辑工具

✨ 1: 谷歌 I/O 2024 谷歌 I/O 2024 发布了众多新技术,包括 Gemini AI、大语言模型和通用 AI 智能体等,全面颠覆搜索体验。 谷歌 I/O 2024发布会带来许多令人兴奋的新功能和技术创新: Gemini 1.5 Pro:一个极其强大的语言模型&am…

消息队列选型

一、要解决的问题 1.1 异步 分析: 需要根据场景来判断。若整体链路的逻辑中,某些逻辑是不需要强实时的,滞后一段时间是允许的,同时又不会对用户带来不好的体验,那么可以使用MQ完成异步操作。 例如:秒杀场…

x264 帧类型代价计算原理:slicetype_frame_cost 函数分析

slicetype_frame_cost 函数 函数功能 这个函数的核心是计算编码一系列帧(从 p0 到p1,以 b 为当前帧)的代价 cost,并根据这个代价 cost来辅助帧类型决策。它考虑了运动搜索的结果、帧间和帧内预测的成本,并且可以并行处理以提高效率。该函数在帧类型决策、MBtree 分析、场…

消防物资存储|基于SSM+vue的消防物资存储系统的设计与实现(源码+数据库+文档)

消防物资存储系统 目录 基于SSM+vue的消防物资存储系统的设计与实现 一、前言 二、系统设计 三、系统功能设计 1用户功能模块 2 管理员功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介…

天锐绿盾 | 如何防止电脑内文件遭到泄露?

天锐绿盾是一款专为企业设计的数据防泄漏软件系统,它通过一系列综合性的安全措施来有效防止电脑内文件遭到泄露。 PC地址: https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee 以下是天锐绿盾防止文件泄露的主要功能和方法&a…

酒店刷脸设备遭批量扔进「垃圾桶」,为啥所有人都叫好……

最近,不知道柴油们有没有关注到这么一个热点,就是大量酒店曾经动辄几千上万买来的刷脸设备,大批量的被挂在二手平台1折甩卖了…… 昔日花大几千,甚至上万买来的设备,如今年低至三四百?打折打到脚底板&#…

8.2 GOOGLE(SAML应用)登录联携AWS用户池(Amazon Cognito)

GOOGLE(SAML应用)登录联携AWS用户池(Amazon Cognito) 目录一、参考资料二、创建和配置AWS用户池1. 创建用户池2. 在用户池中创建联合身份提供商3. 在用户池中创建应用程序集成 三、创建和配置GOOGLE SAML应用1. 创建GOOGLE SAML应…

nodemon运行ts文件

https://juejin.cn/post/7035637086451400734 nodemon经常用来调试js文件,大家都是知道的,但是用nodemon来调试ts文件,大家试过吗? 如果直接运行nodemon index.ts是会报错的。 ts 复制代码 //index.ts console.log(1) 需要全局…

Find My OBD|苹果Find My技术与OBD结合,智能防丢,全球定位

OBD是英文On-Board Diagnostics的缩写,中文翻译为“车载自动诊断系统”。这个系统将从发动机的运行状况随时监控汽车是否尾气超标,一旦超标,会马上发出警示。当系统出现故障时,故障(MIL)灯或检查发动机(Check Engine)警告灯亮&…