一文带你了解Java中synchronized原理

🌈🌈🌈今天给大家分享的是Java中 synchronized 的基本原理 

清风的CSDN博客

🛩️🛩️🛩️希望我的文章能对你有所帮助,有不足的地方还请各位看官多多指教,大家一起学习交流!

✈️✈️✈️动动你们发财的小手,点点关注点点赞!在此谢过啦!哈哈哈!😛😛😛

目录

一、synchronized 基本特点 

二、加锁工作过程 

2.1 偏向锁 

2.2 轻量级锁 

2.3 重量级锁 

 三、其他的优化操作

3.1 锁消除 

3.2 锁粗化 


 

一、synchronized 基本特点 

结合上篇文章给大家分享的锁策略 , 我们就可以总结出 , Synchronized 具有以下特性 ( 只考虑 JDK 1.8)。
  • 开始时是乐观锁, 如果锁冲突频繁, 就转换为悲观锁
  • 开始是轻量级锁实现, 如果锁被持有的时间较长, 就转换成重量级锁
  • 实现轻量级锁的时候大概率用到的自旋锁策略
  • 是一种不公平锁
  • 是一种可重入锁
  • 不是读写锁

二、加锁工作过程 

JVM synchronized 锁分为 无锁、偏向锁、轻量级锁、重量级锁 状态。会根据情况,进行依次升级。 

2.1 偏向锁 

第一个尝试加锁的线程 , 优先进入偏向锁状态。
  • 偏向锁不是真的 "加锁", 只是给对象头中做一个 "偏向锁的标记", 记录这个锁属于哪个线程
  • 如果后续没有其他线程来竞争该锁, 那么就不用进行其他同步操作了(避免了加锁解锁的开销)
  • 如果后续有其他线程来竞争该锁(刚才已经在锁对象中记录了当前锁属于哪个线程了, 很容易识别当前申请锁的线程是不是之前记录的线程), 那就取消原来的偏向锁状态, 进入一般的轻量级锁状态。
  • 偏向锁本质上相当于 "延迟加锁", 能不加锁就不加锁, 尽量来避免不必要的加锁开销。
    但是该做的标记还是得做的, 否则无法区分何时需要真正加锁。

举个例子理解偏向锁:

假设男主是一个锁, 女主是一个线程。如果只有这一个线程来使用这个锁, 那么男主女主即使不领证结婚(避免了高成本操作), 也可以一直幸福的生活下去。
但是女配出现了, 也尝试竞争男主, 此时不管领证结婚这个操作成本多高, 女主也势必要把这个动作完成了, 让女配死心。

2.2 轻量级锁 

随着其他线程进入竞争 , 偏向锁状态被消除 , 进入轻量级锁状态 ( 自适应的自旋锁 )。此处的轻量级锁就是通过 CAS(后面我会给大家详细介绍)  来实现。
  • 通过 CAS 检查并更新一块内存 (比如 null => 该线程引用)
  • 如果更新成功, 则认为加锁成功
  • 如果更新失败, 则认为锁被占用, 继续自旋式的等待(并不放弃 CPU)

自旋操作是一直让 CPU 空转, 比较浪费 CPU 资源。因此此处的自旋不会一直持续进行, 而是达到一定的时间/重试次数, 就不再自旋了。也就是所谓的 "自适应"。

2.3 重量级锁 

如果竞争进一步激烈 , 自旋不能快速获取到锁状态 , 就会膨胀为重量级锁,此处的重量级锁就是指用到内核提供的 mutex 。
  • 执行加锁操作, 先进入内核态
  • 在内核态判定当前锁是否已经被占用
  • 如果该锁没有占用, 则加锁成功, 并切换回用户态
  • 如果该锁被占用, 则加锁失败, 此时线程进入锁的等待队列, 挂起等待被操作系统唤醒
  • 经历了一系列的沧海桑田, 这个锁被其他线程释放了, 操作系统也想起了这个挂起的线程, 于是唤醒这个线程, 尝试重新获取锁

 三、其他的优化操作

3.1 锁消除 

编译器+JVM 判断锁是否可消除,如果可以, 就直接消除。什么是 "锁消除"

 有些应用程序的代码中, 用到了 synchronized, 但其实没有在多线程环境下,(例如 StringBuffer)

StringBuffer sb = new StringBuffer();
sb.append("a");
sb.append("b");
sb.append("c");
sb.append("d");
此时每个 append 的调用都会涉及加锁和解锁,但如果只是在单线程中执行这个代码, 那么这些加
锁解锁操作是没有必要的, 白白浪费了一些资源开销。

3.2 锁粗化 

一段逻辑中如果出现多次加锁解锁 , 编译器 + JVM 会自动进行锁的粗化。
锁的粒度: 粗和细
实际开发过程中, 使用细粒度锁, 是期望释放锁的时候其他线程能使用锁。但是实际上可能并没有其他线程来抢占这个锁,这种情况 JVM 就会自动把锁粗化, 避免频繁申请释放锁。

举个例子理解锁粗化:

滑稽老哥当了领导, 给下属交代工作任务:
方式一:
  • 打电话, 交代任务1, 挂电话
  • 打电话, 交代任务2, 挂电话
  • 打电话, 交代任务3, 挂电话

方式二:

  • 打电话, 交代任务1, 任务2, 任务3, 挂电话
显然, 方式二是更高效的方案。

 


🌈🌈🌈好啦,今天的分享就到这里!

🛩️🛩️🛩️希望各位看官读完文章后,能够有所提升。

🎉🎉🎉创作不易,还希望各位大佬支持一下!

✈️✈️✈️点赞,你的认可是我创作的动力!

⭐⭐⭐收藏,你的青睐是我努力的方向!

✏️✏️✏️评论:你的意见是我进步的财富!

 

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

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

相关文章

国产接口测试工具APIpost

说实话,了解APIpost是因为,我的所有接口相关的文章下,都有该APIpost水军的评论,无非就是APIpost是中文版的postman,有多么多么好用,虽然咱也还不是什么啥网红,但是不知会一声就乱在评论区打广告…

MobaXterm连接相关

其实最终解决的方法,还是,因为要远程连接的是个局域网ip,我所在的ip和要连接的这个不在同一个局域网内,需要实验室搭的VPN才行。 甚至,我连防火墙都没关,也可以连接 至于修改密码,passwd&#…

沐风老师3DMAX键盘球建模方法详解

3DMAX键盘球建模教程 本教程给大家分享一个3dMax键盘球的建模方法过程。在学习本教程之前,大家需要对3dMax基本操作及建模知识有所掌握,还是那句话:做实例的前提是选学习基础知识和掌握3dMax的基本操作。 下面就给大家一步一步讲解演示3dMax…

Graphpad Prism10.1.0 安装教程 (含Win/Mac版)

GraphPad Prism GraphPad Prism是一款非常专业强大的科研医学生物数据处理绘图软件,它可以将科学图形、综合曲线拟合(非线性回归)、可理解的统计数据、数据组织结合在一起,除了最基本的数据统计分析外,还能自动生成统…

python socket编程7 - 使用PyQt6 开发UI界面新增实现UDP server和client单机通讯的例子

在第五篇中,简单实现了命令行下的 TCP/UDP server和client的单机通讯。 在第六篇中,实现了PyQt6开发界面,TCP协议实现的单机server和client的通讯功能。 这一篇,在第六篇的基础上,增加了UDP server和client的单机通讯功…

四川云汇优想:抖音直播等级怎么升级?

抖音直播,作为当前最热门的社交平台之一,其等级体系一直备受用户关注。如何在抖音直播中迅速提升等级,成为众多用户探讨的话题。在这篇文章中,我们将深入探讨抖音直播等级的升级机制、好处以及一些实用的技巧,助你在抖…

三、C语言常见概念

目录 1. C语言是什么? 3. 编译器的选择 3.1 编译和链接 3.2 编译器的对比 6. main函数 7. printf 和 库函数 8. 关键字介绍 8.1 什么是预编译? 8.2 static 的关键词作用? 8.3 const 的作用 8.4 voliate 的作用 8.5 typedef 的作用…

吉他初学者学习网站搭建系列(5)——如何做一个在线节拍器

文章目录 背景实现TransportLoop代码 在线尝试 背景 我们看吉他谱时,经常看到拍号,例如6/8。它的含义是一拍是一个八分音符,一小节有六拍。四分音符的时长是一秒,即60拍/分钟。基于这样的背景知识,我们就可以根据一些…

基于springboot的校园二手市场

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

vFW搭建IRF

正文共:2328字 40图,预估阅读时间:5 分钟 IRF(Intelligent Resilient Framework,智能弹性架构)技术通过将多台设备连接在一起,虚拟化成一台设备,集成多台设备的硬件资源和软件处理能…

【网络安全】-常见的网站攻击方式详解

文章目录 介绍1. SQL 注入攻击攻击原理攻击目的防范措施 2. 跨站脚本攻击(XSS)攻击原理攻击目的防范措施 3. CSRF 攻击攻击原理攻击目的防范措施 4. 文件上传漏洞攻击原理攻击目的防范措施 5. 点击劫持攻击原理攻击目的防范措施 结论 介绍 在数字时代&a…

2023年【T电梯修理】考试总结及T电梯修理证考试

题库来源:安全生产模拟考试一点通公众号小程序 T电梯修理考试总结考前必练!安全生产模拟考试一点通每个月更新T电梯修理证考试题目及答案!多做几遍,其实通过T电梯修理证考试很简单。 1、【多选题】《特种设备安全法》规定&#x…

安美数字酒店宽带运营系统 SQL注入漏洞复现

0x01 产品简介 HiBOS酒店宽带运营系统隶属于安美世纪(北京)科技有限公司开发的一套酒店宽带管理系统。 0x02 漏洞概述 安美数字酒店宽带运营系统 online_status.php、language.php等接口处存在SQL注入漏洞,未经身份认证的攻击者可以通过此漏洞获取数据库权限,进一步利用可…

自定义 el-select 和 el-input 样式

文章目录 需求分析el-select 样式el-input 样式el-table 样式 需求 自定义 选择框的下拉框的样式和输入框 分析 el-select 样式 .select_box{// 默认placeholder:deep .el-input__inner::placeholder {font-size: 14px;font-weight: 500;color: #3E534F;}// 默认框状态样式更…

mysql中删除数据后,新增数据时id会跳跃,主键自增id不连续

引言: 在使用MySQL数据库时,有时候我们需要删除某些记录,但是删除记录后可能会导致表中的id不再连续排序。 如何实现删除记录后让id重新排序的功能。 如图: 删除数据后,中间的id不会自动连续。 下面有两种方法进行重…

【matlab程序】matlab画螺旋图|旋转图

%% 数学之美====》螺旋线 % 海洋与大气科学 % 20231205 clear;clc;close all; n=10; t=0:0.01:2pin; R=1; xx=nan(length(t),1);yy=nan(length(t),1); for i=1:length(t) xx(i)=Rcos(t(i)); yy(i)=Rsin(t(i)); R=R+1; end figure set(gcf,‘position’,[50 50 1200 1200],‘col…

java电子班牌人脸识别管理平台源码,SaaS云平台端、智慧校园管理平台端、家长/教师微信移动端、智慧班牌学生端

什么是电子班牌? 电子班牌用来显示班级信息,班级活动信息以及学校的通知信息。信息内容为文字、图片、视频等,为生和老师提供新颖的师生交流及校园服务平台。融合了多媒体信息发布、家校互通、物联控制、教务管理、日常办公等一系列应用&…

知识管理平台Confluence:win10安装confluence

文章目录 介绍主要功能 安装教程安装java运行平台JRE安装数据库Postgresql在Postgresql创建confluence使用的数据库创建数据库用户创建数据库 安装confluence注册confluence启动confluence 参考链接 介绍 Confluence 是由澳大利亚软件公司 Atlassian 开发的企业协作平台。它提…

外包干了2个月,技术倒退2年。。。。。

先说一下自己的情况,本科生,20年通过校招进入深圳某软件公司,干了接近4年的功能测试,今年国庆,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

处理k8s中创建ingress失败

创建ingress: 如果在创建过程中出错了: 处理方法就是: kubectl get ValidatingWebhookConfiguration kubectl delete -A ValidatingWebhookConfiguration ingress-nginx-admission 然后再次创建,发现可以: