简谈你对synchronized关键字的使用

news/2025/1/11 4:53:18/

👨‍🎓作者: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.ppmy.cn/news/107799.html

相关文章

计划学习网络安全,需要学习哪些知识,应该怎么学习?

虽然现在的网络安全大都是指渗透测试,但是并不代表只有渗透测试这一个方向,除此之外还有二进制逆向这个方向。以下会对这两个方向分别对您进行详解。 渗透测试方向 1、学习编程语言 (1)网站如何搭建的?HTML、CSS、J…

macOS visual studio code 没有读写权限 检查更新报错

问题描述 visual studio code 检查更新,报错,visual studio code没有磁盘读写权限。(可能会导致插件安装报错?) 报错:The application is on a read-only volume. Please move the application and try a…

C/C++实现透明窗口程序

本文介绍几种在Windows环境下通过C/C++使用WIN32API实现透明窗口的方法。如有问题,请私信或者在评论区评论。 一、透明窗口实现 1. 方式一 通过 SetLayeredWindowAttributes 函数实现,需要添加以下代码: // 设置窗口透明度 SetLayeredWindowAttributes(hWnd, // 窗…

Vulkan Tutorial 7 纹理贴图

目录 23 图像 图片库 暂存缓冲区 纹理图像 布局转换 将缓冲区复制到图像上 准备纹理图像 传输屏障掩码 清除 24 图像视图和采样器 纹理图像视图 采样器 Anisotropy 设备特征 25 组合图像采样器 更新描述符 纹理坐标系 着色器 23 图像 添加纹理将涉及以下步骤&am…

2022-Deep generative molecular design reshapes drug discovery-分子生成设计重塑药物发现

文章目录 药物发现中的深度生成模型化合物/分子的表示 Deep Generative Models递归神经网 RNN变分自动编码器 VAE生成性对抗网络 (Generative Adversarial Networks, GANs)Flow-based models强化学习(Reinforcement Learning, RL) 在小分子药物设计中的应用生成有效的小分子生成…

分布式补充技术 01.AOP技术

01.AOP技术是对于面向对象编程(OOP)的补充。是按照OCP原则进行的编写,(ocp是修改模块权限不行,扩充可以) 02.写一个例子: 创建一个新的java项目,在main主启动类中,写如下代码。 package com.co…

github SSH 生成和使用(详细)

通过ssh连接github,可以有效的提升安全性 1.设置位置 2.生成ssh密钥(windows) 打开git bash,输入以下命名,把your_emailexample.com换成自己的github账号 ssh-keygen -t rsa -b 4096 -C "your_emailexample.co…

iOS推送证书格式转换

步骤: 1.将cer文件转换为pem格式的文件 打开终端----->cd打开到aps.cer文件文件夹,执行下面的命令 命令: openssl x509 -inform der -in 文件名称.cer -out PushChatCert.pem(我一般命名aps.cer) (PushChatCert.pem&#xff1a…