一篇终结synchronized

news/2024/4/20 22:00:08/文章来源:https://blog.csdn.net/weixin_44638539/article/details/130257453

一:基本原理

Java对象在内存中由两部分组成 : 1 是成员变量 2 是对象头,以32位虚拟机介绍:此时对象头是64位,即8字节
其中32个字节代表 mark word 另外32个字节代表klass word分别是什么意思呢?

1 klass word 代表对象的类型,即student、teacher这种
2 mark word 中,hashcode 占 25位,Age分代年龄 4位,Biased_lock代表是否是偏向锁,最后两位代表加锁状态

多线程访问三种情况
1 单线程访问
2 多线程交替访问
3 多线程竞争激烈
锁升级主要依赖存在Java对象中的Mark Word中的锁标识位和释放偏向锁标识位
无锁001
偏向锁101 MarkWord 存储的是偏向的线程ID
轻量锁00 MarkWord 存储的是线程栈Lock Record指针
重量锁10 MarkWord 存储的是指向堆中monitor对象的指针

二:锁升级之偏向锁

缺点:每次发生锁重入时,每次重入都需要cas检查
例如 方法1 调用方法2 方法2调用方法3,都是同一把锁,可以成功,但是每次都会新产生一个锁记录对象,和对象头交换,虽然交换失败,但是知道这个锁是自己加的,所以还是会拿到锁,这样每次都进行cas操作依然有性能损耗

有没有办法避免这种损耗呢?
就是偏向锁,只有第一次使用CAS将线程ID设置到对象(threadId 替换 markword),之后发现这个线程id是自己的就表示没有竞争,不用重新CAS,等于说这把锁是这个线程专用的了

三:锁升级之轻量锁

多线程访问时间错开,没有竞争,可以用轻量锁优化,语法依然是synchronized,使用时优先使用轻量锁,加锁失败,或竞争激烈才会用重量锁

基本原理

当线程a调用一个方法时,会产生一个锁记录对象
锁记录对象包含两部分{
1 对象指针,记录加锁对象的地址
2 存储将来加锁对象的mark word
}
如下图,左为锁记录对象,右为锁对象
在这里插入图片描述
锁记录对象会将对象指针与锁对象的mark word交换,这是一个CAS操作,此时,锁对象的mark word 中不再是之前提到的hashcode等信息,而是锁记录地址

四:锁膨胀

轻量级锁竞争失败,进入锁膨胀,升级为重量级锁,如果尝试加轻量锁失败,代表已经有其他线程加了轻量锁(有竞争),这时需要锁膨胀,将轻量锁升级为重量锁

例如现在thread1已经加了锁,现在来了一个thread2,想用轻量锁方式加锁,就想把自己的对象指针与markword交换,此时交换失败,因为此时后两位是00,不再是无锁状态

失败后进入锁膨胀

 1 为object对象申请Monitor锁,让Object指向重量级锁地址2 自己进入Monitor的EntryList bloked3 markword后两位变成104 thread1 退出同步块解锁时,使用cas将mark word 的值恢复给对象头5 失败这时会进入重量级解锁流程,即按照monitor地址找到monitor对象,设置owner为null,唤醒
EntryList 的bloked线程

自旋优化:

一次失败后不立即进入阻塞,而是再尝试几次,在尝试的过程中
如果持有锁的线程退出了同步块,当前线程就可以避免阻塞

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

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

相关文章

写题总结1

先把自己写完的总结一下: 题目一: 猫儿园的告示牌上贴着 ab 大小的矩形广告纸。猫猫对广告不感兴趣,她想知道能否用 cd 的矩形白纸完全覆盖这个广告。猫猫可以对白纸进行平移、旋转,但不能折叠或撕开等。如果可以完全覆盖输出 YE…

滴水逆向3期笔记与作业——01汇编

防止OneNote丢失。 海哥牛逼。 01汇编笔记 01进制进制定义10-2进制转换八进制 02数据宽度/逻辑运算数据宽度与存储逻辑运算计算机做加法的本质作业 03通用寄存器_内存读写通用寄存器表通用寄存器图内存读写计算机操作系统位数意义 04内存地址_堆栈寻址公式PUSH指令POP指令作业 …

【IAR工程】STM8S基于ST标准库读取DHT11数据

【IAR工程】STM8S基于ST标准库读取DHT11数据 ✨申明:本文章仅发表在CSDN网站,任何其他网站,未注明来源,见此内容均为盗链和爬取,请多多尊重和支持原创!🍁对于文中所提供的相关资源链接将作不定期更换。&…

4月有8本SCIE期刊被剔除(附MDPI/Frontiers/Hindawi最新在检期刊)

2023年4月SCI、SSCI期刊目录更新 2023年4月18日,科睿唯安更新了WOS期刊目录,继上次3月WOS期刊目录剔除50本SCIE&SSCI期刊之后,此次4月更新又有8本SCIE期刊发生变动,其中有4本期刊被踢出SCIE数据库,4本期刊更改了名…

流程图拖拽视觉编程--概述

一般的机器视觉平台采用纯代码的编程方式,如opencv、halcon,使用门槛高、难度大、定制性强、开发周期长,因此迫切需要一个低代码开发的视觉应用平台。AOI缺陷检测的对象往往缺陷种类多,将常用的图像处理算子封装成图形节点,如抓直…

Android 系统架构大图

android的系统架构和其操作系统一样,采用了分层的架构。从架构图看,android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和Linux核心层。 1.应用程序 Android会同一系列核心应用程序包一起发布,该应用…

确定因果随机森林的树木数量 the number of trees

前言 推断因果性和分析异质性是统计学家在处理混杂任务中的圣杯。传统且主流的方法有:倾向性评分、分层分享、比例风险模型等。新的方法也有很多,代表就是:因果随机森林。这种算法,浅看难度一般,深入探索发现坑还是很多的。这篇博客不对算法做深入探讨,仅仅是我在阅读文…

Nautilus Chain :基于模块化架构的Layer3正在走向成熟

Nautilus Chain 是一个基于 Eclipse 和 Celestia 构建的模块化 Layer3 链。作为定位在 Layer0 的链基建概念,Eclipse 和 Celestia 为面向未来的区块链扩容技术提供了一套开发工具和基础框架。尽管这种前沿技术过去一直处于概念验证阶段,尚未推出适用于大…

Java并发(三)----创建线程的三种方式及查看进程线程

一、直接使用 Thread // 创建线程对象 Thread t new Thread() {public void run() {// 要执行的任务} }; // 启动线程 t.start(); 例如: // 构造方法的参数是给线程指定名字,推荐 Thread t1 new Thread("t1") {Override// run 方法内实现…

手把手教你PXE高效网络装机、Kickstart无人值守安装(详细版)

目录 一、部署PXE远程安装服务1.1PXE定义1.2PXE服务优点1.3搭建网络体系前提条件1.4 搭建PXE远程安装服务器 二. 实验2.1 服务器操作2.2 安装启动TFTP服务并修改TFTP服务的配置文件2.3 安装并启用DHCP服务2.4 准备linux内核,初始化镜像文件2.5 准备PXE引导程序2.6 安…

22、Tweak原理及部分逆向防护

一、Tweak原理 1.1 Tweak产物.dylib 执行make命令时,在 .theos的隐藏目录中,编译出obj/debug目录,包含 arm64、arm64e两种架构,同时生成readbadges.dylib动态库 在arm64、arm64e目录下,有各自架构的readbadges.dylib,而debug目录下的readbadges.dylib,是一个胖二进制文件 fi…

【Java-01】深入浅出匿名对象 , 继承 , 抽象类

主要内容 面向对象回顾 匿名对象介绍 面向对象特征 - 继承 抽象类的使用 模板设计模式 1 面向对象回顾 面向对象的核心思想是什么 ? 用代码来模拟现实生活中的事物 , 比如学生类表示学生事物 , 对象表示的就是具体的学生 , 有了类就可以描述万千世界所有的事物了 现有的…

看完这篇文章你就彻底懂啦{保姆级讲解}-----(LeetCode刷题142环形链表II) 2023.4.24

目录 前言算法题(LeetCode刷题142环形链表II)—(保姆级别讲解)分析题目:算法思想环形链表II代码:补充 结束语 前言 本文章一部分内容参考于《代码随想录》----如有侵权请联系作者删除即可,撰写…

前端食堂技术周刊第 80 期:Vite 4.3、Node.js 20、TS 5.1 Beta、Windi CSS 即将落幕

美味值:🌟🌟🌟🌟🌟 口味:东坡肉 食堂技术周刊仓库地址:https://github.com/Geekhyt/weekly 本期摘要 Vite 4.3Node.js 20TypeScript 5.1 BetaWindi CSS 即将落幕Pretty TypeScri…

中医脉诊仪:结合传统与现代技术的诊断工具

一、引言 随着科技的不断发展,医学领域也取得了举世瞩目的进步。中医作为一种古老的医学体系,始终保持着其独特的魅力。脉诊作为中医诊断的重要方法之一,历经千年的发展和传承,如今在现代科技的助力下,诞生了中医脉诊…

信息安全复习六:公开密钥密码学

一、章节梗概 1.公开密钥密码模型的基本原理 2.两个算法:RSA&D-H算法 主要内容 1.对称密钥密码的密钥交换问题 2.公钥密码模型的提出 3.设计公钥密码的基本要求 4.数字签名 5.RSA算法 6.公钥密码的特征总结 二、对称密钥密码 对称加密算法中,数据…

实例分割算法BlendMask

实例分割算法BlendMask 论文地址:https://arxiv.org/abs/2001.00309 github代码:https://github.com/aim-uofa/AdelaiDet 我的个人空间:我的个人空间 密集实例分割 ​ 密集实例分割主要分为自上而下top-down与自下而上bottom-up两类方法…

基于趋动云的chatGLM-6B模型的部署

首先根据官方示例教程,学会怎么创建项目,怎么使用数据,怎么进入开发环境,以及了解最重要的2个环境变量: 这个是进入开发环境以后的代码目录 $GEMINI_CODE 这个是引用数据集后,数据集存放的路径 $GEMINI_DA…

Linux内核进程管理与调度:策略优化与实践分析

Linux内核进程管理与调度 一、前言二、进程管理和多进程调度2.1 进程标识符和控制块2.2 进程状态和转换2.3 进程间通信 三、单处理器下的Linux进程调度3.1 Linux进程调度器3.2 时间片轮转调度算法3.3 最短剩余时间优先调度算法3.4 其他调度算法的不足 四、多处理器下的Linux进程…

Layui 2.8.0 正式发布,朴实归来

Layui 是一套开源的 Web UI 组件库,采用自身轻量级模块化规范,遵循原生态的 HTML/CSS/JavaScript 开发模式,极易上手,拿来即用。其风格简约轻盈,而内在雅致丰盈,甚至包括文档在内的每一处细节都经过精心雕琢…