Java多线程编程之synchronizaed和锁分类

并发编程第三周

1 锁的分类

1.1 可重入锁,不可重入锁

Java提供的synchronized,ReentrantLock,ReentrantReadWriteLock都是可重入锁

可重入:当前线程获取到A锁,在获取之后尝试再次获取A锁是可以直接拿到的。

不可重入:当前线程获取到A锁,在获取之后尝试再次获取A锁,无法获取到,因为A锁被当前线程占用着,需要等待自己释放锁再获取是锁。

1.2 乐观锁,悲观锁

Java提供的synchronized,ReentrantLock,ReentrantReadWriteLock都是悲观锁

Java中提供的CAS操作,就是乐观锁的一种实现

悲观锁:获取不到锁资源时,会将当前线程挂起(进入BLOCK,WAITING),线程挂起会涉及到用户态和内核态的切换,消耗资源

  • ​ 用户态:jvm可以自行执行的指令,不需要借助操作系统执行
  • ​ 内核态:jvm不可以自行执行的指令,需要借助操作系统执行

**乐观锁:**获取不到锁可以再让CPU调度,重新尝试获取锁资源

Atomic原子类就是基于CAS乐观锁实现的

1.3 公平锁,非公平锁

Java提供的synchronized只能时非公平锁

ReentrantLock,ReentrantReadWriteLock可以实现公平和非公平

**公平锁:**线程A获取到了锁资源,线程B没有拿到,线程B排队,线程C来了,锁被A持有,同时B在排队。直接排到B后面,等待B拿到锁资源或者B取消后,才可以尝试区竞争锁资源。

非公平锁:线程A获取到了锁资源,线程B没有拿到,线程B排队,线程C来了,直接先去尝试竞争一波

  • 拿到锁:插队成功
  • 没有拿到锁:依然排队到B后面,等待B拿到锁资源或者B取消后,才可以尝试区竞争锁资源

1.4 互斥锁,共享锁

Java提供的synchronized,ReentrantLock 互斥锁

ReentrantReadWriteLock有互斥锁也有共享锁

互斥锁:同一时间点,只会有一个线程持有当前互斥锁

共享锁:同一时间点,当前共享锁可以被多个线程同时持有

2 深入synchronized

2.1 类锁,对象锁

synchronized的使用一般就是同步方法块和同步代码块

synchronizated的锁时基于对象实现的

使用同步方法:

  • static:此时使用的时当前类.class作为锁(类锁)
  • 非static:此时使用的时当前对象做为锁(对象锁)

2.2 synchronized的优化

锁消除:在synchronized修饰的代码中,如果不存在操作临界资源的情况,会触发锁消除,即便写了synchronized也不会触发

public synchronized void method(){
// 没有操作临界资源
// 此时这个方法的synchronized你可以认为木有~~
}

锁膨胀:如果在一个循环中,频繁的获取和释放锁资源,这样带来的消耗很大,锁膨胀就是将锁的范围扩大,避免,频繁的获取和释放锁资源带来不必要的消耗。

锁升级:ReentranLock的实现,是先基于乐观锁CAS尝试获取资源,如果拿不到锁资源,才会挂起线程。synchronizated在jdk1.6之前,完全就是获取不到锁,立即挂起当前线程,所以性能差。

synchronizated在jdk1.6之后做了锁升级的优化

  1. 无锁,匿名偏向:当前对象没有作为锁的存在

  2. 偏向锁:如果当前锁资源只有一个线程频繁的获取和释放,那么这个线程过来,只需要判断当前指向的线程是否位当前线程。

    • 如果是,直接拿走锁资源

    • 如果不是,基于CAS的方式尝试将偏向锁指向当前线程。如果获取不到,锁升级,升级位轻量级锁(偏向锁状态出现了锁竞争的情况)

  3. 轻量级锁:会采用自旋锁的方式取频繁的以CAS的形式获取锁资源。(采用的是自适应自旋锁)

    ​ 如果成功获取到,拿着锁资源走

    ​ 如果自旋一定次数,没有拿到锁资源,锁升级

  4. 重量级锁:就是最传统的synchronized方式,拿不到锁资源,就挂起当前线程。

2.3 synchronized实现原理

synchronized是基于对象实现的。

Java对象在堆内存中的存储

在这里插入图片描述

展开MarkWord

在这里插入图片描述

MarkWord中标记着四种锁的信息:无锁、偏向锁、轻量级锁、

偏向锁延迟:偏向锁在升级为轻量级锁时,会涉及到偏向锁撤销,需要等到一个安全点,才可以做偏向锁撤销,在明知道有并发情况下,就可以选择不开启偏向锁,或者设置偏向锁延迟开启。因为在jvm启动时,需要加载的.class文件到内存中这个操作会涉及到synchronized的使用,为了避免出现偏向锁撤销操作,jvm启动初期,会有一个延迟4s开启偏向锁的操作。如果正常开启偏向锁了,那么不会出现无锁状态,对象会直接变为匿名偏向

整个锁升级状态的转变:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.5 重量锁底层ObjectMonitor

在这里插入图片描述

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

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

相关文章

美业SaaS系统多门店收银系统源码-【分润常见问题】讲解(二)

美业管理系统源码 博弈美业SaaS系统 连锁多门店美业收银系统源码 多门店管理 / 会员管理 / 预约管理 / 排班管理 / 商品管理 / 促销活动 PC管理后台、手机APP、iPad APP、微信小程序 ▶ 分润常见问题: 4、若产品的服务方分润>0,则销售方分润和服…

Unity Shader中获取像素点深度信息

1.顶点着色器中对深度进行计算 v2f vert(appdata v) {v2f o;o.pos UnityObjectToClipPos(v.vertex);o.uv TRANSFORM_TEX(v.uv, _MainTex);o.depth (o.pos.z / o.pos.w 1.0) * 0.5; // Normalize depth to [0, 1]return o; }但是达不到预期,最后返回的值一直大于…

2024智能电网与能源系统国际学术会议(ICSGES2024)

2024智能电网与能源系统国际学术会议(ICSGES2024) 会议简介 我们诚挚邀请您参加将在南京隆重举行的2024年智能电网与能源系统国际学术会议(ICSGES2024)。南京,一座历史与现代交织的城市,将为这场盛会提供独特的学术…

力扣刷题--数组--第一天

一、数组 数组特点: 连续内存空间存储得数据元素类型一致数组可以通过下标索引查找数据元素,可以删除、替换、添加元素等 1.1 二分查找 使用二分查找需满足得条件: 数组是有序的;数组中没有重复元素;查找的target…

论文辅助笔记:TimeLLM

1 __init__ 2 forward 3 FlattenHead 4 ReprogrammingLayer

暗区突围进不去/游戏无法启动/掉帧卡顿/报错的解决方法

暗区突围是一款高拟真硬核射击手游,打造了全新的沉浸式暗区战局体验,发行商是腾讯公司。这个游戏名词虽然看起来有些陌生,但其本身的玩法内核毫无疑问的是,这款游戏在画面质量和枪械操作方面,都是手游市场上同类游戏中…

springboot模块以及非springboot模块构成的多模块maven项目最佳构建方式

文章目录 背景一般的实现使用spring-boot-dependencies 更优雅的实现. 背景 有时候构建一个多模块maven项目其中某一个模块是web-service需要使用spring boot,其他模块跟spring boot 完全无关,本文总结一下在这个场景下maven项目最佳构建方式. 一般的实现 网上应该也看到过很…

我独自升级崛起下载教程 我独自升级崛起怎么一键下载

定于5月8日全球盛大发布的动作RPG力作《我独自升级崛起》,基于备受追捧的同名动画及网络漫画,誓为热情洋溢的游戏爱好者们呈献一场深度与广度兼具的冒险盛宴。这款游戏巧妙融合网络武侠元素,其创意十足的设计框架下,核心叙述聚焦于…

记录一次给PCAN升级固件pcan_canable_hw-449dc73.bin

方法一:网页升级 首先将3.3V与BOOT短接,插入电脑USB接口,识别为STM32 BOOTLOADER,芯片进入DFU模式。 如果电脑没有识别到STM32 BOOTLOADER,或无法驱动,则需要安装ImpulseRC_Driver_Fixer修复工具。 推荐使用Google浏览器打开网页升级选择PCAN固件,点Connect and Update,…

一部手机实现全行业的AI实景自动无人直播软件:为商家提供更便捷的推广方式

随着人工智能技术的快速发展,AI实景自动无人直播软件成为了商家推广产品的新宠。这款软件结合了智能讲解、一键开播、智能回复等多项功能,为商家提供了一种全新的直播方式。 首先,智能讲解功能让专业主播录制直播脚本,并通过软件自…

如何从零开始学习数据结构?

在开始前我有一些资料,是我根据网友给的问题精心整理了一份「数据结构的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!!数据结构 算法=程…

Navicat Data Modeler Ess for Mac:强大的数据库建模设计软件

Navicat Data Modeler Ess for Mac是一款专为Mac用户设计的数据库建模与设计工具,凭借其强大的功能和直观的界面,帮助用户轻松构建和管理复杂的数据库模型。 Navicat Data Modeler Ess for Mac v3.3.17中文直装版下载 这款软件支持多种数据库系统&#x…

MySQL之查询 拿下 * 。*

DQL数据查询语言 对上述的的查询操作进行代码演示(续上一篇学生表代码进行处理) 下面是上一篇的代码分享 下面进行简单的查询操作 字符串如果强行进行算数运算默认只为0 查询时常用的单行函数列举 未完待续

什么牌子的骨传导耳机质量好?五大宝藏热门机型测评对比!

我作为一名音乐发烧友,对各类耳机产品都有深入的了解,最近也经常被人问及骨传导耳机哪个牌子好。通过交流,我发现很多人在选择骨传导耳机的时候,都有出现踩坑的情况,这也难怪,随着骨传导耳机热度逐渐增加&a…

Google搜索广告怎么开户?谷歌广告开户投放引流技巧、账户搭建、谷歌ads广告推广投放策略 #搜索引擎 #谷歌广告#互联网营销

Google搜索广告开户步骤: 选择代理商:首先,您需要选择一个经验丰富、信誉良好的Google广告代理商。可以选择上海上弦来广告开户和代运营。 初步咨询:与代理商进行初步沟通,了解他们的服务内容、成功案例、收费标准等。…

RCLAMP0854P.TCT ESD抑制器 静电和浪涌保护 应用领域

RCLAMP0854P.TCT 是一款电路保护器件,属于Transient Voltage Suppressor (TVS) 系列产品。它是一种低电容TVS阵列,具有 RailClamp 标志性技术,旨在为电子设备提供高效防护,免受高电压瞬变和静电放电(ESD)的…

22_Scala集合Seq

文章目录 Seq序列1.构建集合2.List集合元素拼接&&集合拼接3.可变Seq&&List3.1 ListBuffer创建3.2 增删改查3.3 相互转化 Appendix1.Scala起别名2.Seq底层3.关于运算符操作: :4.空集合的表示 Seq序列 –Seq表示有序,数据可重复的集合 1.构建集合 …

一致性评价政策加速行业仿制药洗牌,惯爱为代表的新锐品牌崭露头角

从印度神油到以形补形,男人的问题,从古至今一直困扰着很多人,大多人都羞于启齿。然而,沉默的背后,隐藏着令人震惊的数据:据统计显示,ED(勃起功能障碍)是男性生殖系统发病…

抖音短视频矩阵系统技术源头/源代码开发部署/SaaS贴牌/源码api代开发

抖音短视频矩阵系统技术源头/源代码开发部署/SaaS贴牌/源码官方平台api授权代开发 一、短视频矩阵系统源码开发步骤 短视频矩阵系统的源头开发步骤通常包括以下几个关键阶段: 1.需求分析:明确系统的目标用户、功能需求、性能要求等。 2.系统设计&…

4.4网安学习第四阶段第四周回顾(个人学习记录使用)

本周重点 ①Linux系统提权 ②Linux权限维持 ③Windows 提权 ④Windows权限维持 ⑤SSRF利用 ⑥内网环境 ⑦内网扫描 ⑧漏洞利用 ⑨内网代理 ⑩获取主机控制权其他方案 ⑩①vuln靶场 ⑩②CS代理与ICMP隧道 本周主要内容 ①Linux系统提权 系统提权是成功入侵系统之…