Synchronized用过吗,其原理是什么

news/2024/11/5 17:16:18/文章来源:https://www.cnblogs.com/89564f/p/18528376


synchronized 是由一对 monitorenter/monitorexit 指令实现的,monitor 对象是同步的基本实现单元。在 Java 6 之前,monitor 的实现完全是依靠操作系统内部的互斥锁,因为需要进行用户态到内核态的切换,所以同步操作是一个无差别的重量级操作,性能也很低。但在 Java 6 的时候,Java 虚拟机 对此进行了大刀阔斧地改进,提供了三种不同的 monitor 实现,也就是常说的三种不同的锁:偏向锁(Biased Locking)、轻量级锁和重量级锁,大大改进了其性能。

 

在JDK1.6以后Synchronized引入了偏向锁、轻量级锁、重量级锁、锁的粗化、锁消除的优化。并发性能基本和Lock持平的。

偏向锁:是不存竞争情况下,从而在后续的代码块中没有加锁解锁的开销
轻量级锁:轻量级锁所适应的场景是线程交替执行同步块的场合
重量级锁:重量级锁首先会经过一定次数的CAS自旋操作获取锁,如果获取失败,存在同一时间多个线程访问同一把锁的场合,就会导致轻量级锁膨胀为重量级锁。是在竞争激烈的情况下创建一个monitor对象,并且将线程挂起,而挂起就要切换到内核状态执行。从而开销非常大。
轻量级锁:当锁是偏向锁时,有另外一个线程来访问,会撤销掉偏向锁,然后升级为轻量级锁,这个线程会通过自旋方式不断获取锁,不会阻塞,提高性能

重量级锁:轻量级锁尝试去获取到锁,如果获取失败线程就会进入阻塞状态,该锁会升级为重量级锁,重量级锁时,来竞争锁的所有线程都会阻塞,性能降低

注意,锁只能升级不能降级

(1)可重入性
synchronized的锁对象中有一个计数器(recursions变量)会记录线程获得几次锁;
1.可重入的好处:
2.可以避免死锁;
3.可以让我们更好的封装代码;
synchronized是可重入锁,每部锁对象会有一个计数器记录线程获取几次锁,在执行完同步代码块时,计数器的数量会-1,直到计数器的数量为0,就释放这个锁。
(2)不可中断性
1.一个线程获得锁后,另一个线程想要获得锁,必须处于阻塞或等待状态,如果第一个线程不释放锁,第二个线程会一直阻塞或等待,不可被中断;
2. synchronized属于不可被中断;3.Lock lock方法是不可中断的;4.Lock tryLock方法是可中断的;

`synchronized`锁具有不可中断性,即一旦某个线程获得了锁,其他试图获取该锁的线程将一直处于阻塞状态,直到持有锁的线程释放锁为止。而Lock接口中的tryLock方法则提供了可中断的特性,允许在一定时间内尝试获取锁,如果无法立即获取到锁,则可以返回false而不阻塞当前线程。

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

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

相关文章

算法与数据结构——基数排序

基数排序 基数排序(radix sort)的核心思想与计数排序一致,也通过统计个数来实现排序。计数排序适用于数据量n较大但数据范围m比较小的情况。假设我们需要对n=106个学号进行排序,而学号是一个8位数字,这意味着数据范围m=108非常大,使用计数排序需要分配大量内存空间,而基…

第二届全国高校软件测试开发教育峰会在韩山师范学院隆重举办!

10月26日-27日,由测试开发校企联合培养联盟主办、韩山师范学院承办、测吧(北京)科技有限公司及<火焰杯>软件测试开发大赛组委会协办的第二届全国高校软件测试开发教育峰会在韩山师范学院隆重举行。本次峰会汇聚了来自全国各大高校的教师及企业嘉宾,旨在共同探讨软件测…

如何使用nssm将asp.net core/.net6/.net8的webapi项目、mvc项目、控制台项目等注册为windows服务

nssm工具可以将asp.net Framework、asp.net core、net6、.net8的webapi项目、mvc项目、控制台项目、winform项、WPF项目等注册为windows服务。 nssm可以将所有windows可执行文件注册为windows服务。 下面,使用nssm将asp.net8的webapi项目注册为windows服务为例:【第一步】开发…

转 分布式执行计划

###sample 1 https://open.oceanbase.com/blog/1100217?_gl=1*10gldye*_ga*Mjc3Nzg0NTIwLjE3MzA3ODg3NDI.*_ga_T35KTM57DZ*MTczMDc5NDE2Ny4yLjEuMTczMDc5NTk5NC42MC4wLjA.本文介绍 OceanBase 的 SQL 执行类型。分布式数据库下数据分布在各个节点,SQL 很有可能会跨节点取数据。…

中公网校视频课件课程下载工具,如何在电脑端下载中公网校视频课件资料到本地?

一. 安装中公网校课程下载器 1.获取学无止下载器 https://www.xuewuzhi.cn/eoffcn_downloader 2.下载安装后,然后点击桌面快捷方式运行即可。 注意:杀毒软件可能会阻止外部exe文件运行,并将其当做成病毒,直接添加信任即可,本软件绝对没有木马病毒。 二. 使用说明 1.学无止…

后端整合 Swagger + Knife4j 接口文档

后端整合 Swagger + Knife4j 接口文档什么是接口文档?写接口信息的文档,每条接口包括:请求参数 响应参数错误码接口地址 接口名称 请求类型 请求格式 备注who 谁用?一般是后端或者负责人来提供,后端和前端都要使用 为什么需要接口文档?有个书面内容(背书或者归档),便于…

start-all.sh脚本启动Hadoop的NameNode、DataNode、ResourceManager和NodeManager失败

今天在做大数据实验时,在终端,start-all.sh脚本启动Hadoop的NameNode、DataNode、ResourceManager和NodeManager失败,出现下面的错误信息: [root@node1 hadoop]# ./sbin/start-all.shStarting namenodes on [node1]ERROR: Attempting to operate on hdfs namenode as rootE…

Dash 2.18.2版本更新:模式匹配回调性能大提升

本文示例代码已上传至我的Github仓库:https://github.com/CNFeffery/dash-master Gitee同步仓库地址:https://gitee.com/cnfeffery/dash-master大家好我是费老师,今天Dash发布了2.18.2版本更新,虽然只是一次小版本更新,但其中涉及到的一些内容还是非常重要的,今天的文章中…

华为云:弹性负载均衡健康检查异常

动态负载均衡健康检查异常 健康检查基本配置如下: 其中内网IP和默认业务端口可以在负载均衡服务器→后端服务器组中查看即实际上的监听对象为192.168.0.170:8889。 健康检查异常说明健康检查curl这两个监听未返回200,去网络控制台→访问控制:安全组→default→入方向规则,查…

合规监管新趋势!智能合同审查免费体验,提升法律行业合同管理效率

思通数科 思通数据 思通数科推出的智能合同审查系统为这些痛点提供了解决方案。借助大模型、OCR和信息抽取等先进技术,系统具备高效要素抽取、自动分类、合同比对和合同审查等功能。以下是该系统的主要功能及用户体验案例,展示了在法律行业中的实际应用效果。应用案例:法律行…

UE Slate渲染流程

【USparkle专栏】如果你深怀绝技,爱“搞点研究”,乐于分享也博采众长,我们期待你的加入,让智慧的火花碰撞交织,让知识的传递生生不息!一、前言本文将深入探讨Slate的渲染流程及其相关细节。将详细讲解Slate如何将UI元素渲染到屏幕上,以及它是如何处理各种渲染细节以实现…

【HT-030-Div.1】核桃NOIP组周赛 赛后总结

总结T2爆零了,核桃oj不能缩放 别人题目(100%)我的题目(125%)