简谈你对synchronized关键字的使用

news2024/11/24 0:31:00

👨‍🎓作者:bug菌
✏️博客:CSDN、掘金、infoQ、51CTO等
🎉简介:CSDN|阿里云|华为云|51CTO等社区博客专家,历届博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,掘金 | InfoQ | 51CTO等社区优质创作者,全网粉丝合计15w+  ;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等海量资料。

...

✍️温馨提醒:本文字数:1999字, 阅读完需:约 5 分钟

🏆本文收录于《Java进阶实战》,专门攻坚指数提升。

本专栏致力打造最硬核 Spring Boot 从零基础到进阶系列学习内容,🚀均为全网独家首发,打造精品专栏,专栏持续更新中…欢迎大家订阅持续学习。

小伙伴们在批阅文章的过程中如果觉得文章对您有一丝丝帮助,还请别吝啬您手里的赞呀,大胆的把文章点亮👍吧,您的点赞三连(收藏⭐+关注👨‍🎓+留言📃)就是对bug菌我创作道路上最好的鼓励与支持😘。时光不弃🏃🏻‍♀️,创作不停💕,加油☘️

1. 前言

        说起对synchronized的使用,第一次接触还是在手写单例类的时候,DCL实现线程安全的高性能懒汉模式。

        但是聊起synchronized,日常项目开发过程中还是相对比较少用的,起码我在的项目中很少用到它,可能项目相对传统吧,不知道你们用的多不多。

        但在面试过程中,考察多线程相关知识,synchronized必被问到,高频考点。大家都知道用它可以保证线程安全,但是再继续深入聊,恐怕就不是很轻松回答得上来了。

        所以今天我们也来简单聊聊它,一个在java多线程中的元老级锁的存在,看看它有哪些独特的魅力吧。

2. 环境说明

本地的开发环境:

  • 开发工具:IDEA 2021.3
  • JDK版本: JDK 1.8
  • Spring Boot版本:2.3.1 RELEASE
  • Maven版本:3.8.2

3. 简介

        synchronized,中译过来的意思为“同步”,java锁的一种,也是java关键字的成员之一,其中官方对它的解释及定位是使用synchronized()方法用于防止线程干扰和内存一致性错误,由此可见,它在多线程中的地位还是很高的。

        在JDK1.5前,它是重量级锁的一种,相当于Lock,使用起来笨重;但随着JavaSE1.6,官方对它进行了大优化,减少锁操作的开销,性能上得到了大提升。

3.1 作用

        那synchronized具体有何作用呢?我们把它归纳总结为以下三点。

3.2 原子性

        所谓原子性,指一个操作或多个操作,要么全部执行且执行的过程不会被所有因素打断干扰,要么一个都不执行。synchronized修饰的类或对象所有操作都是原子性的。

3.3 可见性

        所谓可见性,指多个线程访问同一个资源时,该资源的状态、值信息都是公开可见的。对于synchronized和volatile都具有该特点,当使用synchronized对类或对象加锁时,一个线程如果要访问该类或对象,都必须先获它的锁,这个锁的状态对所有线程都是可见的,而且在释放锁之前会将对变量的修改刷新到共享内存中,以此保证资源变量的可见性。

3.4 有序性

        所谓有序性,指程序执行的顺序按照代码先后执行;对于synchronized和volatile都具有该特点,java虽然允许编译器和处理器对指令进行重排,但是是基于单线程的场景下,若是多线程环境下,就影响程序执行的顺序性了。

        使用synchronized也是为了保证同步代码块每个时刻都只能被一个线程访问,从而保证线程执行同步代码块的顺序性。

4 使用

        它使用时修饰的对象有以下几种:

4.1 修饰实例方法

        被修饰的方法称为同步方法,其作用域是整个方法,锁住的对象是调用这个方法的对象。

public synchronized void method() {
  //业务代码
}

4.2 修饰静态方法

        其作用域是整个静态方法,作用的对象是这个类的所有对象,其效果等效于在同步代码块中锁住类对象:

public synchronized void staic method() {
  //业务代码
}

4.3 修饰代码块

        被修饰的代码块称为同步语句块,其作用范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象。

synchronized(this) {
  //业务代码
}

5. 注意事项

        使用synchronized时需要特别同步块的粒度。因为synchronized同步锁的原子性特性,如果对于同步块中含有耗时任务,就很有可能造成严重堵塞。此时就要减小锁的粒度,让synchronized块中分离耗时且不影响共享状态的操作,尽可能缩小执行时间。

6. 热文推荐🔥

  1. 浅谈你对单例类中使用volatile关键字的理解
  2. Mysql分页 vs Oracle分页 对比分析
  3. Java 如何实现手动连接数据库(MySQL或Oracle)?
  4. Java 如何实现获取客户端公网IP地址?
  5. 为什么print和println输出java对象时会打印内存地址?
  6. 如何解决springboot拦截器@Autowried注入为空问题?
  7. MyBatis中的discriminator鉴别器如何使用?
  8. 如何快速手撕单例类?一文教会你
  9. 如何保证三个线程按顺序执行?不懂我教你
  10. 简谈你对synchronized关键字的使用

7. 最后🔥

🏆本文收录于《Java进阶实战》,需要的小伙伴可以进去瞅瞅。

本专栏致力打造最硬核Java进阶系列学习内容,🚀均为全网独家首发,打造精品专栏,专栏持续更新中…欢迎大家订阅持续学习。

       我是bug菌,一名CSDN / 阿里云 / 华为云 / 51CTO 等社区博客专家,历届博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者,全网粉丝合计10w+,硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!一起学习,一起变强。

关注公众号,获取最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等硬核资源

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

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

相关文章

Word控件Spire.Doc 【其他】教程(4):在 Word 中插入上标和下标

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下,轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具,专注于创建、编辑、转…

5.2.1 分类的IP地址

5.2.1 分类的IP地址 通过前面的学习我们知道IPv4协议中包含的内容非常的多,我们学习IPv4又分为几个方面 介绍分类的IP地址IP地址的分配与使用IP分组的格式因特网地址到物理地址的映射(ARP协议),用以动态完成IP地址到物理地址映射…

时间序列预测 | Matlab基于灰狼算法优化支持向量机(GWO-SVM)的时间序列预测

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 时间序列预测 | Matlab基于灰狼算法优化支持向量机(GWO-SVM)的时间序列预测 评价指标包括:MAPE、MAE、RMSE和R2等,代码质量极高,方便学习和替换数据。要求2018版本及以上。 部分源码 %----------------

别再纠结页面设计!挑选小程序页面设计模板就对了

小程序页面设计模板可以是一个非常棒的选择,特别是如果你想要快速创建一个优秀的小程序。 以下是一些关于如何选择小程序页面设计模板的建议: 确定你的需求:在开始挑选小程序页面设计模板之前,你需要明确你的需求。确定你的小程…

下载安装LabVIEW

下载安装LabVIEW 介绍下载安装流程下载安装 后续 介绍 LabVIEW 是 工程 师 用来 开发 自动 化 研究、 验证 和 生产 测试 系统 的 图形 化 编 程 环境。Labview作为图形化编程语言,图形控件拖拽式编程,显得更加直观形象,也很容易上手学习。 …

pytorch 绘制一维热力图

热力图 热力图(Heat Map)是指用 X 轴 和 Y 轴 表示的两个分类字段确定数值点的位置,通过相应位置的矩形颜色去表现数值的大小,颜色深代表的数值大。 热力图是非常特殊的一种图,可以显示不可点击区域发生的事情。热力…

3.5. 异常处理

在Java中,异常是一种用于表示程序在运行过程中遇到的错误或异常情况的对象。Java提供了一套异常处理机制,可以帮助我们更好地处理运行时可能出现的错误和异常。异常处理的主要概念包括: 异常类:Java中的异常类是继承自Throwable类…

L1频段卫星导航射频前端低噪声放大器芯片 AT2659/AT2659S

AT2659 是一款具有高增益、低噪声系数的低噪声放大器(LNA)芯片,支持L1频段多模式全球卫星定位,可以应用于GPS、北斗二代、伽利略、Glonass等GNSS导航接收机中。芯片采用先进的SiGe工艺制造,采用1.5 mm X 1 mm 0.78 mm的…

招标采购评标专家管理数智化解决方案

评标专家作为评标活动的重要一环,对保证评标活动的公平公正和评标质量,乃至提升营商环境都意义重大。 为了加强招采过程中评标专家的监督管理、健全评标专家库制度,保证评标活动的公平公正,提高评标质量,国家出台了相…

Pytest 高级进阶用法Hook使用pdm打包成插件

系列文章目录 提示:阅读本章之前,请先阅读目录 文章目录 系列文章目录前言一、创建项目二、安装pdm三、使用pdm创建项目四、创建src五、src下面,再创建包名六、编写plugin七、编写配置pyproject.toml八、使用pdm,添加pytest到该插…

如何看待人工智能?——比尔盖茨谈智能时代的机遇与挑战

原创 | 文 BFT机器人 01 比尔盖茨称AI将颠覆搜索、购物网站 “你永远不会去搜索网站了,也不会再去亚马逊了。” 当地时间5月22日,盖茨在出席一场关于AI的活动时表示,未来的顶级AI助理将颠覆现有互联网使用方式,替代人们执行某些任…

PHPMySQL基础(三):处理查询SQL返回的结果集

PHP&MySQL基础(一):创建数据库并通过PHP进行连接_长风沛雨的博客-CSDN博客 PHP&MySQL基础(二):通过PHP对MySQL进行增、删、改、查_长风沛雨的博客-CSDN博客 目录 一、连接MySQL,处理错误,统一字…

面了个4年经验的测试,自动化都不会,真是醉了····

最近面试了一个 4 年测试经验的测试工程师,简历和个人介绍都提到了会自动化,于是我就问了几个自动化方面的问题: 在自动化测试中,你是如何选择和设计测试用例的?你使用过哪些自动化测试工具,如何选择自动化…

从C语言到C++_14(vector的常用函数+相关选择题和OJ题)

目录 1. vector的常用函数 1.1 vector 的介绍 1.2 vector 的初始化 1.3 vector 的操作和遍历 1.4 vector 的容量和增删查改 2. vector 相关笔试题 3. vector 相关OJ题 136. 只出现一次的数字 - 力扣(LeetCode) 解析代码: 118. 杨辉…

华为OD机试真题B卷 Java 实现【求解立方根】,附详细解题思路

一、题目描述 计算一个浮点数的立方根,不使用库函数。保留一位小数。 数据范围:∣val∣≤20 。 二、输入描述 待求解参数,为double类型(一个实数) 三、输出描述 输出参数的立方根。保留一位小数。 四、解题思路…

【九】设计模式~~~结构型模式~~~外观模式(Java)

【学习难度:★☆☆☆☆,使用频率:★★★★★】 4.1. 模式动机 不知道大家有没有比较过自己泡茶和去茶馆喝茶的区别,如果是自己泡茶需要自行准备茶叶、茶具和开水,如图1(A)所示,而去茶馆喝茶,最…

从自动化到测开,测试人员逆袭之路从此起步...

在当今竞争激烈的软件测试行业中,近期的招聘市场确实面临一些挑战。大量的求职者争相涌入岗位,许多热衷于功能测试的人士甚至难以找到理想的工作机会。更不幸的是,连自动化测试和性能测试这些专业领域也受到了测试开发人员的竞争压力。然而&a…

jvs-rules 规则引擎-变量管理(函数式)的配置说明

JVS规则引擎变量管理 变量在规则引擎中的作用 数据存储和共享:变量配置允许在规则引擎中存储和访问数据。通过定义变量,可以将数据存储在规则引擎中,使其可供规则和决策过程使用。这样可以消除重复数据存储的需求,提高数据的共享…

ipad手写笔什么牌子好?最好用的电容笔

由于Apple pencil太过昂贵,很多小伙伴想入手一支电容笔,但是国内的品牌众多,不知道该如何挑选出合适自己的电容笔,我们在挑选电容笔要注意一些事项,才能挑选出合适的电容笔,今天给大家总结几个点再给大家介…

如何部署项目到Tomcat + 第一个Servlet程序

博主简介:想进大厂的打工人博主主页:xyk:所属专栏: JavaEE初阶 目录 文章目录 一、Tomcat 1.1 Tomcat是什么 1.2 下载安装 1.3 部署项目 二、第一个Servlet程序 2.1 Servlet是什么 2.2 创建Maven项目 2.3 引入依赖 2.4 创建目录 2.5 编写类方法 2.6 打包…