当前位置: 首页 > news >正文

2023.10.28 关于 synchronized 原理

目录

synchronized 特性

synchronized 优化机制

锁升级(锁膨胀)

其他优化机制

锁消除

锁粗化


synchronized 特性

  • 开始时是乐观锁,如果锁冲突频繁,就转为悲观锁
  • 开始是轻量级锁,如果锁被持有的时间较长,就转化成重量级锁
  • 实现轻量级锁的时候大概率用到的自旋锁策略
  • 是一个不公平锁
  • 是一种可重入锁
  • 不是读写锁

synchronized 优化机制

锁升级(锁膨胀)

  • JVM 将 synchronized 分为以下四个状态,会根据情况,依次进行升级
  1. 无锁
  2. 偏向锁
  3. 轻量级锁
  4. 重量级锁

无锁状态

  • 即代码还未执行到加锁的代码块中,该状态称为无锁状态

偏向锁状态

  • 偏向锁的获取和释放操作开销非常低,几乎可以忽略不记,因为它不需要进行线程间的竞争和同步
  • 当一个线程第一次尝试获取锁时,会将锁的标记设置为偏向锁,并将线程ID 记录在锁的元数据中
  • 当同一个线程再次尝试获取锁时,无需竞争,直接获取到锁,不需要进行任何同步操作
  • 如果在整个使用锁的过程中,都没有出现锁竞争,那在 synchronized 执行完之后,取消偏向锁即可
  • 如果期间另一个线程尝试获取锁,偏向锁会自动撤销,升级为真正的加锁状态,从而另一个线程也就只能阻塞等待了

注意

  • 偏向锁的使用是 JVM 自动进行的,开发人员无需显式地使用偏向锁
  • JVM 会根据锁的竞争情况自动选择使用偏向锁、轻量级锁、重量级锁,以优化锁的性能和吞吐量

轻量级锁状态

  • 当 synchronized 发生锁竞争的时候,就会从偏向锁,升级成轻量级锁
  • 此时 synchronized 相当于通过 CAS 操作,以不断自旋的方式来进行加锁
  • 如果别人很快就释放锁了,自旋是划算的,但是如果迟迟拿不到锁,一直自旋显然是不划算的,因为会长期占用的 CPU 资源,造成性能损失

重量级锁状态

  • 当然 synchronized 自旋不是无休止的自旋,自旋到一定程度之后,就会再次升级成 重量级锁(挂起等待锁)
  • 如果线程进行了重量级锁的加锁,并且发生锁竞争,此时线程就会被放到阻塞队列中,暂时不参与 CPU 调度了
  • 然后直到锁被释放,这个线程才有机会被调度到,并且有机会获取到锁
  • 一旦 线程被切换出 CPU,此时就会变得比较低效了

注意:

  • 在 JVM 主流实现中,只有锁升级,没有锁降级

其他优化机制

锁消除

  • 编译器智能的判定,看当前的代码是否真的要加锁
  • 如果这个场景不需要加锁,程序员也加了,就自动把锁给干掉

实例理解

  • StringBuffer 中的关键方法都带有 synchronized 
  • 如果在单线程中使用 StringBuffer,synchronized 加了也白加,此时编译器就会直接把这些加锁操作消除掉了

锁粗化

锁的粒度

  • synchronized 包含的代码越多,粒度就越粗
  • 包含的代码越少,粒度就越细

通常理解

  • 一般情况下,认为锁的粒度细一点是比较好的
  • 加锁部分的代码,是不能并发执行的
  • 锁的粒度越细能并发的代码就越多,反之越少
  • 但有些情况下,锁的粒度粗一些反而更好

  • 如上图,这里的间隙非常小,就算并发了,也没啥太大效果
  • 然而每次加锁都是带有开销的
  • 此时并发节省的时间,反而不如加锁的开销大
  • 所以我们不如将其转变为直接加一把大锁

  • 上述过程就相当于锁粗化

相关文章:

2023.10.28 关于 synchronized 原理

目录 synchronized 特性 synchronized 优化机制 锁升级(锁膨胀) 其他优化机制 锁消除 锁粗化 synchronized 特性 开始时是乐观锁,如果锁冲突频繁,就转为悲观锁开始是轻量级锁,如果锁被持有的时间较长&#xff0c…...

力扣 27. 移除元素

目录 1.解题思路2.代码实现 1.解题思路 利用双指针思路,当让一个指针先走,指针指向的位置不等于val时,将此时该指针的值给另一个指针并且两个指针都加一,如果等于val,则让该指针加一继续走.最后另一个指针的下标就为排好的数组的…...

redis爆满导致数据丢失

记一则redis爆满导致数据丢失的一场事故 某功能上线后,发现出现问题,最后定位到了 redis. 由于存储的数据过多,导致阿里云4G大小的 redis 爆满,触发了回收策略。 于是临时扩容,运维同学当时未找到阿里云配置。 后面我用工具连接了…...

Android14 WMS启动流程

一 概述 本文Android14源代码可参考:Search 在 Android 系统中,从设计的角度来看,窗口管理系统是基于 C/S 模式的。整个窗口系统分为服务端和客户端两大部分,客户端负责请求创建窗口和使用窗口,服务端完成窗口的维护…...

磁盘管理(初始化,引导块,坏块管理,固态硬盘)

目录 1.磁盘初始化2.引导块3.坏块的管理1.坏块检查2.坏块链表3.扇区备用 4.固态硬盘(SSD)1.原理2.组成3.读写性能特性4.与机械硬盘相比5.磨损均衡技术 1.磁盘初始化 ①进行低级格式化(物理格式化),将磁盘的各个磁道划分…...

mysql冷拷贝大表

1、简述: mysql数据迁移有多种方式,最常见的就是先把数据库导出,然后导入新的数据库。拷贝数据目录data是另外一种方式。 尤其是当数据库启动不了,或者大型数据库迁移的时候,可以考虑这个方式。 2、场景&#xff1a…...

苍穹外卖-01

苍穹外卖-01 课程内容 软件开发整体介绍苍穹外卖项目介绍开发环境搭建导入接口文档Swagger 项目整体效果展示: ​ 管理端-外卖商家使用 ​ 用户端-点餐用户使用 当我们完成该项目的学习,可以培养以下能力: 1. 软件开发整体介绍 作为一名…...

GAMP源码阅读(中)伪距单点定位 SPP

原始 Markdown文档、Visio流程图、XMind思维导图见:https://github.com/LiZhengXiao99/Navigation-Learning 文章目录 一、SPP 解算1、spp():单点定位主入口函数2、estpos()3、estpose_()4、valsol():GDOP和卡方检验结果有效性 二、卫星位置钟…...

Epinoia-有状态网络的意图验证模块,略读

Epinoia relies on a unified model for NFs by leveraging the causal precedence relationshipsthat exist between NF packet I/Os and states. 这句话的意思是:“Epinoia依靠一种统一的网络功能(NF)模型,通过利用存在于 NF 包…...

14.力扣c++刷题-->有效括号

题目:给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合…...

scrapy-redis分布式爬虫(分布式爬虫简述+分布式爬虫实战)

一、分布式爬虫简述 (一)分布式爬虫优势 1.充分利用多台机器的带宽速度 2.充分利用多台机器的ip地址 (二)Redis数据库 1.Redis是一个高性能的nosql数据库 2.Redis的所有操作都是原子性的 3.Redis的数据类型都是基于基本数据…...

单目深度估计之图像重构原理解析

一、参考资料 浅析自监督深度估计中的光度损失(Photometric Loss) 二、图像重构原理 设输入位姿估计网络的3帧连续单目序列为 < I t − 1 , I t , I t 1 > <I_{t-1},I_{t},I_{t1}> <It−1​,It​,It1​>&#xff0c;其中 t t t 为时间索引&#xff0c;…...

【爬虫】charles手机抓包环境设置(设置系统证书)

1.说明 想要对手机抓包&#xff0c;最关键的是需要设置好根证书&#xff0c;用户证书在安卓7.0之后就不受信任了&#xff0c;想要对手机app抓包&#xff0c;就需要把用户证书设置为系统证书&#xff08;根证书&#xff09; 注意&#xff0c;想要设置为根证书&#xff0c;你的…...

【flink sql table api】时间属性的指定与使用注意事项

文章目录 一. 时间属性介绍二. Table api指定时间属性三. 处理时间的指定1. 在创建表的 DDL 中定义2. 在 DataStream 到 Table 转换时定义3. 使用 TableSource 定义 四. 事件时间的指定1. 在 DDL 中定义2. 在 DataStream 到 Table 转换时定义3. 使用 TableSource 定义 五. 小结…...

评价模型:CRITIC客观赋权法

目录 1.算法原理介绍2.算法步骤2.1 数据标准化2.2 计算信息承载量2.3 计算权重和得分 3.案例分析 1.算法原理介绍 CRITIC方法是一种客观权重赋权法&#xff0c;其基本思路是确定指标的客观权数以两个基本概念为基础。一是对比强度&#xff0c;它表示同一指标各个评价方案取值差…...

两个Tomcat插件配置不同端口,session冲突,同时登录被挤下线问题的解决

如果是配置了两个Tomcat的插件&#xff0c;在同一ip有两个需要同时登录的项目&#xff0c;可以在其中一个web项目的web.xml文件里添加session命名的配置&#xff0c;如下&#xff1a; <!--配置不同的session&#xff0c;避免管理端和手机端两个同时登录被挤下线--><se…...

Mybatis中执行Sql的执行过程

MyBatis中执行SQL的过程可以分为以下几个步骤&#xff1a; 解析配置文件&#xff1a;在运行时&#xff0c;MyBatis会加载并解析配置文件&#xff08;通常为mybatis-config.xml&#xff09;&#xff0c;获取数据库连接信息、映射文件等。 创建SqlSessionFactory&#xff1a;MyB…...

IEEE Standard for SystemVerilog—Chapter 25.7 Tasks and functions in interfaces

子例程&#xff08;任务和函数&#xff09;可以在接口中定义&#xff0c;也可以在连接的一个或多个模块中定义。这允许更抽象的建模级别。例如&#xff0c;“读”和“写”可以定义为任务&#xff0c;而不需要引用任何连线&#xff0c;主模块只能调用这些任务。在modport中&…...

一台服务器最大能支持多少条 TCP 连接

文章目录 1. 一台服务器最大能打开的文件数1.1 限制参数1.2 调整服务器能打开的最大文件数示例 2. 一台服务器最大能支持多少连接3. 一台客户端机器最多能发起多少条连接4. 其他5. 相关实际问题5.1 "too many open files" 报错是怎么回事&#xff0c;该如何解决5.2 一…...

Qt重定向QDebug,Qt/C++开源作品39-日志输出增强版V2022

Qt重定向QDebug&#xff0c;自定义一个简易的日志管理类 Chapter1 Qt重定向QDebug&#xff0c;自定义一个简易的日志管理类0.前言1.最简单的操作运行结果2.实现一个简易的日志管理类 Chapter2 Qt::Qt Log日志模块Qt Log日志模块官方解释官方Demo思路 Chapter3 QT日志模块的个性…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制

使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下&#xff0c;限制某个 IP 的访问频率是非常重要的&#xff0c;可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案&#xff0c;使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...

【Linux】Linux安装并配置RabbitMQ

目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的&#xff0c;需要先安…...

32单片机——基本定时器

STM32F103有众多的定时器&#xff0c;其中包括2个基本定时器&#xff08;TIM6和TIM7&#xff09;、4个通用定时器&#xff08;TIM2~TIM5&#xff09;、2个高级控制定时器&#xff08;TIM1和TIM8&#xff09;&#xff0c;这些定时器彼此完全独立&#xff0c;不共享任何资源 1、定…...

RushDB开源程序 是现代应用程序和 AI 的即时数据库。建立在 Neo4j 之上

一、软件介绍 文末提供程序和源码下载 RushDB 改变了您处理图形数据的方式 — 不需要 Schema&#xff0c;不需要复杂的查询&#xff0c;只需推送数据即可。 二、Key Features ✨ 主要特点 Instant Setup: Be productive in seconds, not days 即时设置 &#xff1a;在几秒钟…...