synchronized原理

Synchronized能够实现原子性和可见性:在Java内存模型中,synchronized规定,线程在加锁时,先清空工作内存→在主内存中拷贝最新变量的副本到工作内存→执行完代码→将更改后的共享变量的值刷新到主内存中→释放互斥锁。

  • synchronized是一种互斥锁,一次只能允许一个线程进入被锁住的代码块
  • synchronized是Java的一个关键字,它能够将代码块/方法锁起来
  • 如果synchronized修饰的是实例方法,对应的锁则是对象实例
  • 如果synchronized修饰的是静态方法,对应的锁则是当前类的Class实例
  • 如果synchronized修饰的是代码块,对应的锁则是传入synchronized的对象实例
    在这里插入图片描述

synchronized的原理

  • 通过反编译可以发现:当修饰方法时,编译器会生成 ACC_SYNCHRONIZED 关键字用来标识。
  • 当修饰代码块时,会依赖monitorenter和monitorexit指令
  • 但前面已经说了,无论synchronized修饰的是方法还是代码块,对应的锁都是一个实例(对象)
  • 在内存中,对象一般由三部分组成,分别是对象头、对象实际数据和对齐填充。重点在于对象头,对象头又由几部分组成,但我们重点关注对象头Mark Word的信息。Mark Word会记录对象关于锁的信息候选者。monitor对象中存储着当前持有锁的线程以及等待锁的线程队列候选者。
    在这里插入图片描述

锁升级

synchronized锁在 JDK 1.6 之后做了很多的优化
在JDK 1.6之前是重量级锁,线程进入同步代码块/方法时,monitor对象就会把当前进入线程的id进行存储,设置Mark Word的monitor对象地址,并把阻塞的线程存储到monitor的等待线程队列中,它加锁是依赖底层操作系统的 mutex 相关指令实现,所以会有用户态和内核态之间的切换,性能损耗十分明显。

而JDK1.6 以后引入偏向锁和轻量级锁在JVM层面实现加锁的逻辑,不依赖底层操作系统,就没有切换的消耗。所以,Mark Word对锁的状态记录一共有4种:无锁、偏向锁、轻量级锁和重量级锁
在这里插入图片描述

  • 偏向锁指的就是JVM会认为只有某个线程才会执行同步代码(没有竞争的环境)。所以在Mark Word会直接记录线程ID,只要线程来执行代码了,会比对线程ID是否相等

    • 相等则当前线程能直接获取得到锁,执行同步代码
    • 如果不相等,则用CAS来尝试修改当前的线程ID
      • 如果CAS修改成功,那还是能获取得到锁,执行同步代码
      • 如果CAS失败了,说明有竞争环境,此时会对偏向锁撤销,升级为轻量级锁。
  • 轻量级锁状态下,当前线程会在栈帧下创建Lock Record,Lock Record 会把Mark Word的信息拷贝进去,且有个Owner指针指向加锁的对象。线程执行到同步代码时,则用CAS试图将Mark Word的指向到线程栈帧的Lock Record

    • CAS修改成功,则获取得到轻量级锁
    • CAS修改失败,则自旋(重试),自旋一定次数后,则升级为重量级锁

简单总结一下:synchronized锁原来只有重量级锁,依赖操作系统的mutex指令,需要用户态和内核态切换,性能损耗十分明显。重量级锁用到monitor对象,而偏向锁则在Mark Word记录线程ID进行比对,轻量级锁则是拷贝Mark Word到Lock Record,用CAS+自旋的方式获取。
在这里插入图片描述
引入了偏向锁和轻量级锁,就是为了在不同的使用场景使用不同的锁,进而提高效率。锁只有升级,没有降级
1)只有一个线程进入临界区,偏向锁
2)多个线程交替进入临界区,轻量级锁
3)多线程同时进入临界区,重量级锁

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

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

相关文章

Axure教程—折叠面手风琴效果

上文中介绍了用Axure制作折叠面板的基础制作,这次介绍折叠面板手机风琴效果 效果 预览地址:https://e18rf6.axshare.com 功能 点击标题展开内容,点击另一标题,其展开的内容折叠 制作 拖入四个动态面板,分别命名为1、…

【微服务】springboot 通用限流方案设计与实现

目录 一、背景 二、限流概述 2.1 dubbo 服务治理模式 2.1.1 dubbo框架级限流 2.1.2 线程池设置 2.1.3 集成第三方组件 2.2 springcloud 服务治理模式 2.2.1 hystrix 2.2.2 sentinel 2.3 网关层限流 三、常用限流策略 3.1 限流常用的算法 3.1.1 令牌桶算法 3.1.2 …

【深度学习】2-5 神经网络-批处理

批处理(Batch Processing)是指在深度学习中每次迭代更新模型参数时同时处理多个样本的方式。 批处理时要注意对应维度的元素个数要一致 关于之前手写数字识别的例子: 用图表示,可以发现,多维数组的对应维度的元素个数…

前端Vue自定义导航栏菜单 定制左侧导航菜单按钮 中部logo图标 右侧导航菜单按钮

前端Vue自定义导航栏菜单 定制左侧导航菜单按钮 中部logo图标 右侧导航菜单按钮, 下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id13152 效果图如下: # cc-navHeader #### 使用方法 使用方法 在page.json设…

一种实现Spring动态数据源切换的方法 | 京东云技术团队

1 目标 不在现有查询代码逻辑上做任何改动,实现dao维度的数据源切换(即表维度) 2 使用场景 节约bdp的集群资源。接入新的宽表时,通常uat验证后就会停止集群释放资源,在对应的查询服务器uat环境时需要查询的是生产库…

实例讲解,一文弄懂workqueue和waitqueue

本期主题: 讲清workqueue和waitqueu: 从中断讲起waitqueue是什么workqueue总结 往期链接: linux设备驱动中的并发linux设备驱动中的编译乱序和执行乱序linux设备驱动之内核模块linux字符驱动linux字符驱动之ioctl部分linux字符驱动之read、…

分布式存储Ceph的部署及应用(创建MDS、RBD、RGW 接口)

系列文章目录 文章目录 系列文章目录一、1.存储基础2. 单机存储的问题3. 分布式存储(软件定义的存储 SDS) 二 Ceph1.Ceph 简介2. Ceph 数据的存储过程 总结 一、 1.存储基础 1.1 单机存储设备 ●DAS(直接附加存储,是直接接到计算…

SAX解析XML返回对应格式的Map对象

前言 最近有一个解析大型xml的需求,xml大小7M,其中xml结构非常复杂,元素各种嵌套 不乏有元素下对象,元素下集合,集合下对象,集合下集合,兄弟不同元素节点,元素下对象下集合&#xff…

HDFS读写流程

读数据流程 客户端向NameNode请求文件的位置:客户端想要访问一个文件时,会向NameNode发送一个请求,要求获取该文件在HDFS上的位置信息。 NameNode将位置信息返回给客户端:NameNode接收到客户端的请求后,会返回该文件所…

设计模式—访问者模式

需求:店铺采购了一批水果(苹果及橘子),现在市场监督局来店里检查过期的水果。 public class Fruit {private String name;private Date pickDate;public Fruit(String name, Date pickDate) {this.name name;this.pickDate pic…

javaWeb之cookiesession

1 回顾 1.1 response对象 一次响应封装对象,由服务器创建。使用response对象将服务器需要的数据发送给浏览器。 将数据存放response对象中,tomcat从response对象获得数据,根据数据组织http响应,最后将http响应内容发送给浏览器&…

selenium自动化教程及使用java来爬取数据

目录 一、介绍二、下载浏览器驱动1.获取要下载的驱动版本号2.下载驱动 三、Maven如下四、简单使用五、定位器1.定位器2.说明(1) class name 定位器(2) css selector 定位器(3) id 定位器(4) name 定位器(5) link text 定位器(6) partial link text 定位器(7) tag 定位器(8) xpa…

第8讲:$.ajax方法使用详解

jQuery对象上面定义了Ajax方法($.ajax()),用来处理Ajax操作。调用该方法后,浏览器就会向服务器发出一个HTTP请求。ajax方法有很多属性,但并非每次调用都要使用所有属性,本讲详细介绍了每个属性的作用&#…

windows搭建vue开发环境

参考博客:最详细的vue安装教程_一只野生程序媛的博客-CSDN博客 Vue安装环境最全教程,傻瓜式安装_浪漫主义码农的博客-CSDN博客 1、安装nodejs,从下面官网下载版本,对应安装就行了: Node.js 中文网 2、安装好后&…

Linux 多路转接 —— poll

目录 传统艺能😎poll🤣struct pollfd🤣 poll 服务器😘PollServer类😁运行服务器😒事件处理😁 服务器测试😂 传统艺能😎 小编是双非本科大二菜鸟不赘述,欢迎米…

0基础学习地平线QAT量化感知训练

文章目录 1. 背景2. 基础理论知识3. 文件准备与程序运行4. 代码详解4.1 导入必要依赖4.2 主函数4.3 构建fx模式所需要的float_model4.4 不同阶段模型的获取4.5 定义常规模型训练与验证的函数4.6 float与qat训练代码解读——float_model/qat_model4.7 模型校准部分的代码解读——…

七、docker-compose方式运行Jenkins,更新Jenkins版本,添加npm node环境

docker-compose方式运行Jenkins,更新Jenkins版本,添加npm node环境 一、docker-compose方式安装运行Jenkins 中发现Jenkins版本有点老,没有node环境,本节来说下更新jenkins 及添加构建前端的node环境。 1. 准备好docker-compose…

三种方法将Word文档转换为PDF文件格式

如何将Word文档转换为PDF文件格式呢?大家在传输文件时,很多人喜欢使用PDF文件格式,因为它非常稳定,不会出现格式混乱的问题。但有些人可能不知道如何进行转换,今天我将介绍三种转换方法,让我们一起来学习一…

mysql 删表引出的问题

背景 将测试环境的表同步到另外一个数据库服务器中,但有些表里面数据巨大,(其实不同步该表的数据就行,当时没想太多),几千万的数据!! 步骤 1. 既然已经把数据同步过来的话&#x…

环境配置 | Git的安装及配置[图文详情]

Git是一个开源的分布式版本控制系统,可以有效、高速地处理从小到大的项目版本管理。下面介绍了基础概念及详细的用图文形式介绍一下git安装过程. 目录 1.Git基础概念 2.Git的下载及安装 3.常见的git命令 Git高级技巧 Git与团队协作 1.Git基础概念 仓库&#…
最新文章