Synchronized关键字的底层原理

Synchronized实现

Synchronized创建的时候一个互斥的对象锁,每次只有一个线程可以获取该锁。

其底层主要是基于Monitor实现的,在对象的对象头中存储了MarkWord存储的就是Monitor的地址。

 对象的内存结构

对象在内存中存储主要分为三个部分:对象头,实例数据,对齐填充。 

对象头:MarkWord用于存储锁的信息,Klass Word用于存储对象的类型。

  • 无锁状态:hashcode(25位)+ 对象分代年龄(4位,不是重点)+ 偏向锁标识(1位)+ 锁标识(2位)
  • 偏向锁:thread(23位,线程id)+ 偏向时间戳(2位,不是重点)+ 偏向锁标识(1位)+ 锁标识(2位)
  • 轻量级锁:对应线程的栈中指向锁记录的指针。(30位)
  • 重量级锁:对应monitor的地址。(30位)

实例数据:用于存储对象中成员变量的信息。 

对齐填充:不是重点,主要是为了保证长度是8的整数倍。

Monitor(重量级锁)

其中包括三个部分:waitSet,entryList,owner。

owner:存储当前获得锁的线程的id。

enrtyList:存储没有获取到锁的线程id的集合,这些线程处于堵塞状态。

waitList:存储处于等待的线程的集合,通常这些线程调用了wait方法。

当线程要获取锁的时候会先去owner判断是否有线程存在,如果没有的话,直接获取锁并将线程id写入owner,反之写入entryList。

轻量级锁

重量级锁主要使用在线程竞争的时候,且重量级锁涉及进程的上下文切换,效率比较低下,在没有线程竞争且不同线程交替执行的时候,推荐使用轻量级锁。

上锁

在线程栈中创建一个锁记录,锁记录中包含 锁记录地址和指向对象的指针两个部分。通过CAS指令将锁记录地址和MarkWord中的地址进行交换

1.如果对象处于无锁状态则说明获取锁成功,且获取的是轻量级锁。

2.如果对象已经有锁了,这此时就是锁的重入,会继续创建锁记录,且也会进行做CAS指令,但是

 记录锁的地址为null。起到锁重入计数效果。

3.如果CAS指令失败了,则会直接使用重量级锁。

解锁

1.遍历线程栈,找到对象指针指向锁对象的锁记录。

2.如果锁记录中的MarkWord的值为null,说明这是一次锁重入操作,直接将锁记录中的指向对象的地址设置为null。

3.如果锁记录中的MarkWord的值不为null,我们就通过CAS指令将锁对象中的MarkWord恢复成无锁状态。

偏向锁

类是轻量级锁,但是在做锁的重入的时候不会使用CAS指令,而是直接判断thread的id是否相同,相同就表示没有竞争。减少了CAS指令操作。适合使用在长时间只有一个线程使用锁

所有锁一但发生了冲突都会变成重量级锁。 

三种锁的使用场景

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

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

相关文章

聊一聊大模型 | 京东云技术团队

事情还得从ChatGPT说起。 2022年12月OpenAI发布了自然语言生成模型ChatGPT,一个可以基于用户输入文本自动生成回答的人工智能体。它有着赶超人类的自然对话程度以及逆天的学识。一时间引爆了整个人工智能界,各大巨头也纷纷跟进发布了自家的大模型&#…

Siamese网络与匈牙利算法在目标跟踪中的研究与应用

1. 引言 目标跟踪是计算机视觉领域中的一个重要研究方向,广泛应用于视频监控、智能交通、人机交互等领域。随着深度学习技术的不断发展,Siamese网络和匈牙利算法在目标跟踪领域的应用逐渐受到关注。本文将对Siamese网络与匈牙利算法以及其在目标…

电动车刷卡-CI522方案

Ci522是一颗工作在13.56MHz频率下的非接触式读写芯片,支持读A卡(CI523支持读A/B卡),可做智能门锁、电动车NFC一键启动、玩具NFC开锁等应用。为部分要求低成本,PCB小体积的产品提供了可靠的选择。 Ci522与Si522/MFRC52…

IDEA插件MybatisLog Free失效,不打印日志解决

因为此插件是基于mybatis的本地日志打印基础上操作的,所以检查是否配置日志输出版本. 如果使用的是mybatis-plus框架检查是否有下面语句 mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl 如果使用的是mybatis框架检查是否有下面语…

巧用JAVA自带的API解决日期类问题

文章目录 题目代码优势 题目 特殊日期 代码 import java.util.Scanner; // 1:无需package // 2: 类名必须Main, 不可修改 import java.time.LocalDate; public class Main {public static void main(String[] args) {Scanner scan new Scanner(System.in);//在此输入您的代…

Python更改YOLOv5、v7、v8,实现调用val.py或者test.py后生成pr.csv,然后再整合绘制到一张图上(使用matplotlib绘制)

1. 前提 效果图 不错的链接:YOLOV7训练模型分析 关于map的绘图、loss绘图,可参考:根据YOLOv5、v8、v7训练后生成的result文件用matplotlib进行绘图 v5、v8调用val.py,v7调用test.py(作用都是一样的,都是…

基于Linux的网络防火墙设计方法

摘要 随着Internet的迅速发展,网络越来越成为了人们日常生活不可或缺的一部分,而随之引出的网络安全问题也越来越突出,成为人们不得不关注的问题。 为了在一个不安全的网际环境中构造出一个相对安全的环境,保证子网环境下的计算机…

javaScript-正则表达式

正则表达式 正则表达式(Regular Expression)是一种描述字符串规律的表达式,可以迅速地用极简单的方式达到字符串的校验控制。 作用:利用较简短的描述语法完成诸如查找、匹配、替换等功能 如何创建正则表达式: 方法1 直接声明…

行业分析:2023年木炭行业市场需求及发展前景

木炭是一种燃料名称。是木材或木质原料经过不完全燃烧,或者在隔绝空气的条件下热解,所残留的深褐色或黑色多孔固体燃料。木炭产品主要分为白炭、黑炭、活性炭、机制炭等四大类。 木炭是保持木材原来构造和孔内残留焦油的不纯的无定形碳。中国商代的青铜器…

【每日OJ —— 101. 对称二叉树】

每日OJ —— 101. 对称二叉树 1.题目:101. 对称二叉树2.解法2.1.算法讲解2.2.代码实现2.3.提交通过展示 1.题目:101. 对称二叉树 2.解法 2.1.算法讲解 1.该题是判断二叉树是否对称,关键在于,左子树等于右子树,而所给的…

Pytorch当中squeeze(1)函数和unsqueeze(1)函数的区别及含义

一、squeeze(1) 在 PyTorch 中,.squeeze(1) 是用于张量维度操作的方法之一,它的作用是将张量中尺寸为 1 的维度压缩(去除)掉。 具体来说,如果张量在指定维度(这里是维度 1)上的尺寸…

一次docker swarm重启的教训

背景: 公司有个业务系统是基于docker swarm的部署架构。由于我修改了某个配置,需要对docker进行重启,执行完systemctl restart docker 以后容器中的服务没有按计划启动起来。 执行docker service ls发现swarm中的服务在,但是容器…

Java手写字典树(Trie树),实现敏感词过滤

1.简介 字典树:也叫做前缀树,是一种高效的存储、配对字符串的数据结构,存储过程如下: 假设我们有单词:app、apple、cat。如果存在链表中: ["app"、"apple"、"api"、"…

Linux 文件查找

1 文件查找 在文件系统上查找符合条件的文件 文件查找:locate,find 1.1 locate 工作特点: 格式: Usage: locate [OPTION]... [PATTERN]...常用选项: -i :不区分大小写的搜索 -n N :只列举前…

python程序将部分文件复制到指定目录

geotools-28.2中的lib一共有264个jar包,但我只想将部分100个左右jar包引导我的环境中,那个就需要从目录中找出想要的那100个jar,手动挑选太费时间,我简单的写了个小脚本来实现。 我将想要的jar文件名和路径存放到txt中&#xff0…

京东商品详情接口在电商行业中的重要性及实时数据获取实现

一、引言 随着电子商务的快速发展,商品信息的准确性和实时性对于电商行业的运营至关重要。京东作为中国最大的电商平台之一,其商品详情接口在电商行业中扮演着重要的角色。本文将深入探讨京东商品详情接口的重要性,并介绍如何通过API实现实时…

js中数组对象去重的方法

前端面试题库 (面试必备) 推荐:★★★★★ 地址:前端面试题库 最近工作中需要用到数组对象去重的方法,我是怎么想也没想出来,今天稍微研究了一下,总算找到了2种方法。分享一下&…

Python编程的经典示例及应用

前言 Python作为一种简洁而强大的编程语言,提供了许多经典示例以展示其语言特性和功能。在本文中,我们将探讨一些经典的Python示例,并展示它们在实际应用中的价值。通过这些示例,读者可以深入了解Python的灵活性和易用性&#xff…

js选中起始时间使用标准时间毫秒值计算一年后的当前少一天的日期(并考虑闰年)

js选中起始时间使用标准时间毫秒值计算一年后的当前少一天的日期 实际代码里面带入默认日期’20230301’这个特殊日期&#xff0c;因为下一年的当前日期少一天为闰年的2月会有29天&#xff0c;使用特殊值校验代码效果图 HTML部分代码 <el-button click"chengTime()&q…

C# WPF上位机开发(带配置文件的倒计时软件)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们写了倒计时软件&#xff0c;但是不知道大家有没有发现&#xff0c;这个软件起始有一个缺点&#xff0c;那就是倒计时的起始时间都是硬编码…