Java多线程(九)

news2025/4/19 9:14:06

目录

一、synchronized基本特点

二、synchronized加锁工作过程

2.1 无锁

2.2 偏向锁

2.3 轻量级锁

2.4 重量级锁

三、synchronized其他优化操作

3.1 锁消除

3.2 锁粗化


一、synchronized基本特点

  1. 开始是乐观锁,如果锁冲突频繁就会转换成悲观锁
  2. 开始是轻量级锁,如果锁被持有的时间变长就会升级成重量级锁
  3. 轻量级锁是通过自旋锁来实现的,重量级锁基于系统的互斥锁来实现的
  4. 是不公平锁(这里的不公平指的是不按照顺序执行线程,谁抢到算谁的)
  5. 是可重入锁(内部会通过计数器来记录加锁次数)
  6. 不是读写锁

二、synchronized加锁工作过程

由于synchronized具有多种特性,所以在加锁的过程中也是有不同的状态。Jvm将synchronized锁分为:无锁 -> 偏向锁 -> 轻量级锁 -> 重量级锁 这4种状态,会根据不同的场景依次进行升级。

2.1 无锁

无锁的解释很简单,线程可能加锁了,但是该线程还能没有被执行,此时synchronized就还处于无锁的状态。也就是说synchronized不会一开始就加锁,这也是效率提升的原因。

2.2 偏向锁

偏向锁不是真的加锁,只是对这个这个锁进行一个“偏向锁标记”,记录当前锁属于哪个线程。当后续有线程进行锁竞争的时候再升级为轻量级锁。

这里的这种做法就类似于单例模式中的懒汉模式,能不加锁就不加锁,尽量避免不必要的开销。但是还是会做好标记,在遇到锁竞争的时候方便加锁。

2.3 轻量级锁

随着其他线程进入竞争,偏向锁的状态解除,进入轻量级锁状态(自适应的自旋锁)。其他线程可能没有直接放弃,而是持续访问查看上个线程是否释放锁,如果释放就能第一时间拿到锁。但是这种情况下也有缺点,如果是上个线程持有的时间比较久,那么这样就会持续的消耗cpu资源。

2.4 重量级锁

如果锁竞争进一步激烈,自旋不能快速的获取到锁,那么synchronized就会膨胀为重量级锁。这里的重量级锁是指内核提供的mutex。

  • 执行加锁操作, 先进入内核态.
  • 在内核态判定当前锁是否已经被占用
  • 如果该锁没有占用, 则加锁成功, 并切换回用户态.
  • 如果该锁被占用, 则加锁失败. 此时线程进入锁的等待队列, 挂起. 等待被操作系统唤醒.
  • 经历了一系列的沧海桑田, 这个锁被其他线程释放了, 操作系统也想起了这个挂起的线程, 于是唤醒这个线程, 尝试重新获取锁.

三、synchronized其他优化操作

3.1 锁消除

这里的锁消除指的是当代码中加了synchronized锁但是并没有多线程,这里的编译器+Jvm就会直接将锁进行消除。但是并不是所有的场景编译器+Jvm都会进行这种优化,所以在编写代码的过程中还是需要自己编写的规范,不要过度依靠外物。

3.2 锁粗化

首先要了解一下这里的“粗”是指的什么,这里“粗”指的是synchronized中执行代码的多少,如果一段代码中多次出现加锁解锁,编译器+Jvm就会自动执行锁的粗化。

 

举个例子理解锁粗化:

滑稽老哥当了领导, 给下属交代工作任务:
方式一:
打电话, 交代任务1, 挂电话.
打电话, 交代任务2, 挂电话.
打电话, 交代任务3, 挂电话.
方式二:
打电话, 交代任务1, 任务2, 任务3, 挂电话.
显然, 方式二是更高效的方案.

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

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

相关文章

UWA Pipeline 2.5.0 版本更新说明

UWA Pipeline是一款面向游戏开发团队的本地协作平台,旨在为游戏开发团队搭建专属的DevOps研发交付流水线,提供可视化的CICD操作界面、高可用的自动化测试以及UWA性能保障服务的无缝贴合等实用功能。 UWA Pipeline 2.5.0 版本发布,一批新功能…

Python系统学习1-6-元组

】目录 一、列表与字符串转换 二、列表推导式 三、元组 1、元组基本操作 2、元组和列表的内存图 四、容器思想 homework 一、列表与字符串转换 (1) 列表转换为字符串: result "连接符".join(列表) # 根据xx条件,循环拼接字符串 # 需…

指针---进阶篇(二)

指针---进阶篇(二) 前言一、函数指针1.抛砖引玉2.如何判断函数指针?(方法总结) 二、函数指针数组1.什么是函数指针数组?2.讲解函数指针数组3.模拟计算器:讲解函数指针数组 三、指向函数指针数组…

8年测试整理,接口测试-测试点分析与搜索查询测试点(超细汇总)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 接口可用性 主要…

Redux - Redux在React函数式组件中的基本使用

文章目录 一,简介二,安装三,三大核心概念Store、Action、Reducer3.1 Store3.2 Reducer3.3 Action 四,开始函数式组件中使用4.1,引入store4.1,store.getState()方法4.3,store.dispatch()方法4.4&…

10年软件测试行业经验教你如何写简历【绝对靠谱】

前言 作为软件测试的从业者,面试或者被面试都是常有的事。 可是不管怎样,和简历有着理不清的关系,面试官要通过简历了解面试者的基本信息、过往经历等。 面试者希望通过简历把自己最好的一面体现给面试官,所以在这场博弈中&…

若依vue -【 100 ~ 更 ~ 110 】

100 主子表代码生成详解 1 新建数据库表结构(主子表) -- ---------------------------- -- 客户表 -- ---------------------------- drop table if exists sys_customer; create table sys_customer (customer_id bigint(20) not null…

母猪产仔早知道,这次南农用上了英伟达边缘 AI Jetson

内容一览:对养猪业而言,母猪产仔是其中关键的一环。因此,提高猪仔成活率、确保母猪分娩过程安全,成为重要课题。现有的 AI 监测方式,存在着高设备成本与信息传输不稳定的问题,南京农业大学研究人员&#xf…

Kali Hyper-V安装正常启动后 黑屏 只能进命令模式

问题: Hyper-V安装虚拟机Kali系统一切安装正常, 没有出现错误. 安装成功后重启,只能进入命令模式,tt1-tt6,进不去GUI桌面. 尝试: 一代二代虚拟硬盘都试过,同样问题,只能开进后进入命令模式,在命令模式下一切运行正常, 也修复过系统 GNOM等的,不管用. 以下为国外论坛给的建议,尝…

Qt 文件对话框使用 Deepin风格

当你在Deepin或UOS 上开发 Qt 程序时,如果涉及到文件对话框功能,那么就会遇到调用原生窗口的问题。 如果你使用的是官方的Qt版本,那么在Deepin或者UOS系统上,弹出的文件对话框会是如下这样: 而Deepin或UOS系统提供的默…

【AI理论学习】手把手推导扩散模型:Diffusion Models(DDPM)

手把手推导扩散模型:Diffusion Models(DDPM) DDPM理论回顾前置知识过程详解Forward ProcessReverse Process DDPM算法伪代码训练部分采样部分 总结一下 参考链接 在这篇博客文章中,我们将深入研究 去噪扩散概率模型(也称为 DDPM&…

利用Simulink Test进行模型单元测试 - 1

1.搭建用于测试的简单模型 随手搭建了一个demo模型MilTestModel,模型中不带参数 2.创建测试框架 1.模型空白处右击 测试框架 > 为‘MilTestModel’创建 菜单 2.在创建测试框架对话框中,点击OK,对应的测试框架MilTestMode_Harness1就自动…

js玩儿爬虫

前言 提到爬虫可能大多都会想到python,其实爬虫的实现并不限制任何语言。 下面我们就使用js来实现,后端为express,前端为vue3。 实现功能 话不多说,先看结果: 这是项目链接:https://gitee.com/xi1213/w…

时间复杂度与空间复杂度的详解

目录 1.时间复杂度 2.时间复杂度计算例题 3.空间复杂度 1.时间复杂度 算法中的基本操作的执行次数,为算法的时间复杂度。 如何表达 时间复杂度? 大O的渐进表示法 实际中我们计算时间复杂度时,我们其实并不一定要计算精确的执行次数&#xf…

105. 从前序与中序遍历序列构造二叉树

题目描述 给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。 示例 1: 输入: preorder [3,9,20,15,7], inorder [9,3,15,20,7] 输出: [3,9,20,null,n…

【高频面试题】多线程篇

文章目录 一、线程的基础知识1.线程与进程的区别2.并行和并发有什么区别?3.创建线程的方式有哪些?3.1.Runnable 和 Callable 有什么区别?3.2.run()和 start()有什么区别? 4.线程包括哪些状态,状态之间是如何变化的4.1.…

一文详述流媒体传输网络MediaUni

一张「多元融合」的网络。 黄海宇|演讲者 大家好,我是阿里云视频云的黄海宇,今天分享主题是MediaUni——面向未来的流媒体传输网络设计与实践。 下面我将会从应用对流媒体传输网络的要求、MediaUni定位与系统架构、MediaUni技术剖析、基于Me…

vr虚拟仿真消防模拟演练提升受训者的安全观念和防范技能

纵观多年来的火灾事故教训得知,火灾发生的原因复杂多样,仅采取单一教育形式无法达到预期效果。消防安全重在预防,VR消防模拟演练系统将火灾安全问题,经采集和汇集处理,以可视化的形式在安全培训平台上进行实时展现&…

微服务与Nacos概述-3

流量治理 在微服务架构中将业务拆分成一个个的服务,服务与服务之间可以相互调用,但是由于网络原因或者自身的原因,服务并不能保证服务的100%可用,如果单个服务出现问题,调用这个服务就会出现网络延迟,此时…

基于STM32 FOC下桥三电阻采样方式的电机相电流重构方法

文章目录 1、本文中的PWM生成模式2、 注意事项3、与SVPWM相关的问题4、采样点的选择4.1、在低调制系数时(1)4.2、在高调制系数时(2)4.3、在高调制系数时(3)4.4、在高调制系数时(4) 5…