synchronized是怎么实现的?

news2024/9/20 4:15:59
  • synchronized是JVM的语法糖,主要是通过JVM来控制的。其实现原理依赖于JVM的监视器和对象头。
    • synchronized修饰方法时,JVM会通过编译完的字节码的访问标记来区分该方法是否被synchronized修饰,在进入方法的时候就会进行获得锁的竞争,获得锁后才能执行方法体
    • synchronized在修饰代码块时,编译后的字节码就会在代码块的前后加上monitorenter和monitorexit标记,一样在进入代码块之前,要先获得锁
    • 对象头信息里有一个markword,是实现synchronized的关键,会根据锁的不同状态保存不同的信息。
      • 无锁:保存hashcode
      • 偏向锁:保存线程ID和偏向标记
      • 轻量级锁:保存指向栈中锁记录的指针
      • 重量级锁,报错指向monitor的指针
      • 48950b730a274d55b6828cbab7addcad.png
  • 加锁流程:
    • 服务起来之后,4s以内只能获得无锁,超过4s才能获得匿名偏向锁(markword中未指定线程id)
      • 为什么要延迟4s?
        • 因为jvm内部代码也用到了很多synchronized,如果启动直接开启偏向锁,如果产生竞争,就会导致锁的升级到轻量级锁,锁的升级会带来额外的性能的消耗
    • 偏向锁解锁完成后,对象头中的线程id不会清0,如果当前线程在进行加锁就不用赋值线程id了
    • 如果偏向锁解锁后,另外一个线程对同一个资源(object)加锁,就会升级成轻量级锁
    • 轻量级锁解锁后就会变成无锁对象(注意这里不会回到偏向锁(一次性的))
    • 无锁对象再加锁,就会变成轻量级锁
    • 初始化成可偏向状态后,该对象调用hashCode()后,会变成无锁对象
    • 偏向锁持有锁的条件下,该锁对象调用hashCode()后,会变成重量级锁

98d1228c02ba41bb9ef165d99b55f385.png

 

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

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

相关文章

鸿蒙媒体开发系列06——输出设备与音频流管理

如果你也对鸿蒙开发感兴趣,加入“Harmony自习室”吧!扫描下方名片,关注公众号,公众号更新更快,同时也有更多学习资料和技术讨论群。 1、音频输出设备管理 有时设备同时连接多个音频输出设备,需要指定音频输…

python 爬虫 selenium 笔记

todo 阅读并熟悉 Xpath, 这个与 Selenium 密切相关、 selenium selenium 加入无图模式,速度快很多。 from selenium import webdriver from selenium.webdriver.chrome.options import Options# selenium 无图模式,速度快很多。 option Options() o…

栈、队列、链表

基于《啊哈!算法》和《数据结构》(人民邮电出版社) 本博客篇幅较多,读者根据目录选择,不理解的可留言和私信。 栈、队列、链表都是线性结构。 三者都不是结构体、数组这种数据类型,我认为更像是一种算法…

面试必备!值得收藏!不容错过的100+ 大语言模型面试问题及答案

引言 大语言模型(LLMs)现在在数据科学、生成式人工智能(GenAI,即一种借助机器自动产生新信息的技术)和人工智能领域越来越重要。这些复杂的算法提升了人类的技能,并在诸多行业中推动了效率和创新性的提升。…

Windows如何查看已缓存的DNS信息

Windows server 2016如何查看已缓存的DNS信息 在Windows server 2016系统下,如何查看已缓存的DNS信息呢? 1.打开“运行”,输入cmd,点击“确定” 2.在命令行界面输入ipconfig /displaydns,按回车即可查看已缓存的dns信息

9月26日云技术研讨会 | SOA整车EE架构开发流程及工具实施方案

面向服务的架构(Service Oriented Architecture, SOA)实施需要复杂的基础技术作为支撑,伴随着整车硬件资源的集中化、车载以太网等高速通信技术在车内的部署,将在未来一段时间内成为行业技术研究和市场布局的热点。 近年来&#x…

分享几种方式获取免费精致的Live2d模型

文章目录 1、 Live2D官方示例数据集(可免费下载)2、模之屋3、unity商店4、直接b站搜索5、youtube6、BOOTH完结 1、 Live2D官方示例数据集(可免费下载) 官方提供了一些 Live2D实例模型给大家下载使用 地址:https://ww…

房屋租赁系统源码分享:SpringBoot + Vue 免费分享

这是一套使用 SpringBoot 与 Vue 开发的房屋租赁系统源码,站长分析过这套源码,推测其原始版本可能是一个员工管理系统,经过二次开发后,功能被拓展和调整,现已完全适用于房屋租赁业务。 源码说明: 该系统功…

一键生成高级感PPT封面,首推这个在线AI生成PPT软件!

PPT封面怎么做? ppt封面的重要性不言而喻,就像写文章讲究的“凤头”,一个漂亮的PPT封面,可以吸引观众的注意力,让人有意愿驻足下来听你演讲,才会有后面更多的故事发生。 漂亮的ppt封面怎么做?…

dll文件丢失怎么恢复?10种dll修复方法任你选,一次学会!

dll文件丢失怎么恢复?dll文件丢失在多个Windows 版本中都是常见的问题,包括win7/win8/win10和 win11。这类错误通常与一些特定的dll文件有关,比如MSVCR110.DLL、MSVCR71.DLL、d3compiler_43.DLL、LogiLDA.DLL、MSVCP140.DLL、api-ms-win-crt-…

组装电脑-电脑配置

键盘、鼠标:买一百多的机械盘。 主板 电脑台式机主板是计算机最基本的同时也是最重要的部件之一,它在整个计算机系统中扮演着举足轻重的角色。以下是对它的详细介绍: 基础功能: 主板作为计算机的核心部件,负责连接和…

【图像检索】基于颜色模型的图像内容检索,matlab实现

博主简介:matlab图像代码项目合作(扣扣:3249726188) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本次案例是基于颜色模型的图像内容检索,用matlab实现。 一、案例背景和算法介绍 这…

inBuilder低代码平台新特性推荐-第二十四期

今天给大家带来的是 inBuilder 低代码平台新特性推荐第二十四期 ——表单格式支持流程配置。 场景介绍: 如下图所示,目前支持在流程设计上的不同节点设置表单字段的必填、显隐等属性控制,不必在表单设计上进行配置,从而减少了开…

VS Code远程连接虚拟机

VS Code远程连接虚拟机 1.下载vscode2.打开VS Code下载Remote-SSH插件1.修改相关信息 3.虚拟机检查或安装ssh4.检查虚拟机服务是否安装成功5.开启ssh,并检查是否开启成功 1.下载vscode 2.打开VS Code下载Remote-SSH插件 1.修改相关信息 2. 3.虚拟机检查或安装ssh…

同一个单元格内包含标签和文本框

<!DOCTYPE html> <html> <head> <title>单元格内包含标签和文本框</title> <style> /* 可选的CSS样式&#xff0c;用于美化表格 */ table { width: 50%; /* 设置表格宽度为页面宽度的50% */ border-collapse: collapse; /* 合并…

【JSrpc破解前端加密问题】

目录 一、背景 二、项目介绍 三、JSrpc 处理前端加密步骤 一、背景 解决日常渗透测试、红蓝对抗中的前端密码加密问题&#xff0c;让你的爆破更加丝滑&#xff1b;降低js逆向加密的难度&#xff0c;降低前端加密逻辑分析工作量和难度。 二、项目介绍 运行服务器程序和js脚本…

解锁生命活力密码!帕金森患者的专属锻炼秘籍,让每一步都稳健前行

在这个快节奏的时代&#xff0c;健康成为了我们最宝贵的财富之一。然而&#xff0c;对于帕金森病患者而言&#xff0c;身体的逐渐僵硬、运动能力的下降&#xff0c;似乎给生活按下了减速键。但请相信&#xff0c;科学的锻炼方法&#xff0c;就是那把重启生命活力的钥匙&#xf…

时间复杂度的常用符号+渐进时间复杂度分析

时间复杂度的常用符号 Θ \Theta Θ 如果 f ( n ) Θ ( g ( n ) ) f(n)\Theta(g(n)) f(n)Θ(g(n))&#xff0c;则 f ( n ) f(n) f(n) 与 g ( n ) g(n) g(n) 同阶。&#xff08;阶是指 f ( n ) f(n) f(n) 的指数&#xff0c;比如 n 2 n^2 n2 高于 n n n&#xff09; O O …

OJ在线评测系统 登录页面开发 前端后端联调实现全栈开发

前端 登录页面就是一个让用户输入账号和密码的表单 使用acro组件 先写布局 <a-form-item field"userAccount" label"账号"><a-input v-model"form.userAccount" placeholder"请输入账号" /></a-form-item><a-…

msvcp140.dll丢失如何解决?msvcp140.dll丢失的多种解决方法

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“msvcp140.dll丢失”。这个错误通常会导致某些应用程序无法正常运行&#xff0c;给用户带来很大的困扰。那么&#xff0c;当我们遇到msvcp140.dll丢失的情况时&#xff0c;应该如何解决呢&a…