总结Java中的synchronized

在这里插入图片描述

T04BF

👋专栏: 算法|JAVA|MySQL|C语言

🫵 小比特 大梦想

目录

  • 总结*synchronized*
    • *初识synchronized*
    • 使用synchronized
    • synchronized的特性
      • (1)可重入性
      • (2)自适应过程
      • (3)锁消除
      • (4)非公平锁
      • (5)互斥锁

总结synchronized

初识synchronized

通过一个线程不安全的例子引入的synchronized
在这里插入图片描述
而出现该问题的原因就是此时的count++操作不是原子的

而我们通过引入synchronized就是将 count++ 这个操作打包成一个原子的操作

使用synchronized

使用synchronized需要针对一个"锁对象",在java里面,任何一个对象都可以作为锁对象
因此针对上述的代码,我们有几种加锁的方式
(1)直接对 count ++ 操作进行加锁
在这里插入图片描述
(2)在类里面的方法里面进行加锁
在这里插入图片描述

(3)直接对方法进行加锁
在这里插入图片描述
(4)针对类对象进行加锁(static方法)
在这里插入图片描述
对于这种,一旦有多个线程调用func,则这些线都会触发锁竞争,尽管不是针对同一个对象

synchronized的特性

(1)可重入性

我们在谈到死锁的时候,会出现的是下面这种情况:
在这里插入图片描述
按照正常逻辑,当我们针对两个相同的锁对象进行加锁操作的时候,如果先获取锁的一方没有释放锁,那么其他地方时不能获取到锁的

那么按照上面的代码,外层先拿到锁,内层的要获取到锁,就要等外层的释放锁,但是外层的释放锁,又要等内层的获取锁,就会造成死锁

而我们运行程序后发现:
在这里插入图片描述
程序是可以正常结束的

这就是synchronized的"可重入性"

实际上上述过程,对于synchronized是不适用的,但是在C++/Python就会出现死锁

是因为在synchronized里面内部自己做了特殊处理,在每一个锁对象里,.都会记录了是当前哪个线程持有了这个锁,当当前针对这个对象加锁操作时,就会先判定一下,当前尝试加锁的线程是否是持有当前锁的线程
如果不是,就阻塞,如果是,就放行

(2)自适应过程

synchronized的自适应过程如下

未加锁 ----(使用synchronized) -> 偏向锁 ----(产生锁冲突) --> 轻量级锁 —(锁冲突加强) --> 重量级锁

这里最主要的就是理解"偏向锁"

事实上,我们在使用synchronized的时候,一开始只是做了个"记号",并不是真正的加锁,这个记号非常轻量,几乎没有开销

此时如果后续不会产生锁冲突,那么就一直保持着偏向锁的状态

而一旦有别的线程想要获取到这把锁,那么synchronized就会立即转化为轻量级锁,此时就真正加锁了,就会产生锁冲突

(3)锁消除

如果你的代码里面加了锁,编译器就会自己帮你判断,这个地方是不是真的要加锁,如果不是,就会自动帮你把锁给优化掉

最典型的就是在单线程里面使用了synchronized

(4)非公平锁

synchronized是一个非公平锁
指的是,当多个线程都在阻塞等待,尝试获取同一把锁的时候,此时一旦锁释放,那么多个线程之间获取到锁的概率是等价的,就各凭本事了
而对公平锁,就是按照"先来后到"的顺序去获取锁,谁等待时间长了,谁就先拿到锁

(5)互斥锁

synchronized本身就是个互斥锁,读写锁则是更加特殊的一种锁

synchronize实际上就是两步,加锁和解锁,而读写锁要进行加读锁和加写锁

要实现,读与读之间不会产生互斥

但是写与写之间 , 读与锁之间就会产生互斥

注意;这里的加读锁和加写锁实际上和我们之前在mysql谈到的事务(读的时候不能写,写的时候不能读)不是一回事,事务本质上是在降低并发能力

而我们这里的读写锁是在提升并发能力,即"读操作和读操作"之间是共享的,不会引发互斥.有利于降低锁冲突的概率

在日常开发中,有很多场景都是属于"读多 写少",如果使用普通的互斥锁,此时,每次读操作之间,即使不会产生线程安全问题,也会互斥,此时就会比较影响效率

感谢您的访问!!期待您的关注!!!

在这里插入图片描述

T04BF

🫵 小比特 大梦想

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

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

相关文章

TCP/IP常用协议栈图解

1.引言 最近看了一些计算机网络的课程,总结借鉴了一些TCP/IP常用协议,罗列在以下图中,以便有一个整体观。 2.图解 先上图 3.总结 TCP/IP协议是实际用的计算机网络通信的标准协议栈,自上而下分为应用层,传输层&#xf…

4.23日总结(项目总结)

1.项目: 今日项目通过一个在登录界面的一个静态变量,完成了区分老师和学生,能够分开老师和学生,并且不同身份的人进去会有不同的显示,以及登录链接主界面,还有学生和老师的不同的表,其次就是创…

陆金所控股一季报到底是利好还是利空?

3月底,陆金所控股(LU.N;06623.HK)因其特别分红方案受到市场高度关注。但在4月23日发布的2024年一季度财报中,陆金所控股营收同比下降30.9%,净亏损8.3亿元。 两者对比,外界不由得对公司的经营状况产生疑惑。…

机器人模型匹配控制(MPC)MATLAB实现

模型匹配控制(Model matching control)是指设计一个控制器使闭环系统的传递函数tf(s)与td(s)相一致! mpcDesigner 可以分为: 2时域精确模型匹配控制3频域精确模型匹配控制 机械臂控制中应用模型匹配控制(Model Matc…

Android ANR 日志导出及分析

导出 ANR 日志 cmd 下 adb shell 进入 adb 交互,cd data/anr 进入 anr 日志文件夹,输入 ls 查看 anr 日志文件列表:exit 退出交互 C:\Users\YourNamePath>adb shell YourDeviceName:/ $ cd data/anr YourDeviceName:/data/anr $ ls anr_…

Rabbitmq安装延迟插件rabbitmq_delayed_message_exchange失败

Docker里的Rabbitmq容器安装延迟插件rabbitmq_delayed_message_exchange失败 一启动插件Rabbitmq容器直接停止运行了 rabbitmq-plugins enable rabbitmq_delayed_message_exchange排除了版本问题和端口问题等,发现是虚拟机运行内存不够,增加虚拟机运行内…

WEB前端-笔记(三)

目录 一、事件 1.1类型 1.2对象 1.3页面加载事件 1.4滚动事件 1.5尺寸事件 1.6捕获&冒泡事件 1.7阻止表单提交 1.8全选案例 1.9事件委托 ​编辑 1.10client&offset 1.11换取元素的位置 1.12创建节点 1.13克隆节点 1.14删除节点 1.15setTimeout 1.16s…

DH 算法;加密算法--基于数学困难问题

目录 DH 算法 加密算法--基于数学困难问题--离散对数问题--可逆困难运算

【Hadoop】-Hive部署[12]

目录 思考 VMware虚拟机部署 规划 步骤1:安装MySQL数据库 步骤2:配置Hadoop 步骤3:下载解压Hive 步骤4:提供MySQL Driver包 步骤5:配置Hive 步骤6:初始化元数据库 步骤7:启动Hive&…

Docker搭建代码托管Gitlab

文章目录 一、简介二、Docker部署三、管理员使用四、用户使用五、用户客户端 一、简介 GitLab是一个基于Git的代码托管和协作平台,类似于GitHub。 它提供了一个完整的工具集,包括代码仓库管理、问题跟踪、CI/CD集成、代码审查等功能。 GitLab的开源版本…

全面了解俄罗斯的VK开户和Yandex投放及内容运营

俄罗斯的VKontakte(简称VK)和Yandex是两个重要的在线平台,对于希望在俄罗斯市场进行推广的企业来说,了解如何在这些平台上开户和投放广告以及内容运营是非常关键的。 俄罗斯vk广告如何开户? 通过上海上弦进行俄罗斯V…

XiaodiSec day024 Learn Note 小迪安全学习笔记

XiaodiSec day024 Learn Note 小迪安全学习笔记 记录得比较凌乱,不尽详细 day24 sql injection 知识点 脚本代码与数据库前置只是 access 数据库注入 mysql 数据库注入 前置知识 开始 数据库类型不同,流程会不同 access 和 asp 目前使用量较少&a…

mysql索引失效的原因以及解决办法

索引失效的原因 条件表达式中使用了函数条件表达式使用了"不等于"操作符列类型不匹配使用LIKE操作符进行模糊匹配数据量过小 解决办法 避免在索引列上使用函数 使用合适的条件表达式 确保查询条件与索引列类型匹配 使用合适的索引 表结构优化 使用索引提示

画图的神器及必备的调色和选图工具

大学生研究生论文写作及画图的神器 前言常用的工具集合画图工具配色参考画图神器词云 最后下篇 前言 好久没有更博,来更一下吧。最近刚好被问到平常是用什么来画图的,包括会议论文,各种类型的PPT汇报以及项目报告等等里面的图怎么画好。所以…

7.2K star!一个完全免费,可以本地部署的 AI 搜索聚合器。新手可尝试

原文链接:7.2K star!一个完全免费,可以本地部署的 AI 搜索聚合器。新手可尝试 ChatGPT 刚上线的时候我用的很少,还是习惯用 Google。主要还是因为不信任,怕它对我胡说八道。 慢慢的,也没有一个明确的时间…

道可云元宇宙每日资讯|上海:推动人工智能创新突破形成新兴产业群

道可云元宇宙每日简报(2024年4月22日)讯,今日元宇宙新鲜事有: 上海:推动人工智能创新突破形成新兴产业群 日前,2024年中共闵行区委网络安全和信息化委员会全体会议召开。会议指出,要持续强化信…

SpringCloud 与 Dubbo 的区别详解

一、Spring Cloud 和 Dubbo 的概述 1.1 SpringCloud 简介 SpringCloud 是一个用于构建云原生应用的框架集合,它为开发者提供了一套完整的工具链,用于快速搭建分布式系统。SpringCloud 基于 SpringBoot 开发,具有如下特点: 提供…

美国签证证件照规格要求(51mm*51mm)

美国签证证件照规格要求(51mm*51mm)

Docusaurus 3.2 发布,更快的 MDX 开发体验

Docusaurus 是一个静态站点生成器。它构建了一个具有快速客户端导航的单页面应用程序,利用 React 的全部功能使你的网站具有交互性。它提供开箱即用的文档功能,但可用于创建任何类型的网站(个人网站、产品、博客、营销登陆页面等)…

十几个好用的学习以及AI网站

目录 1.识典古籍 2.华文慕课 3.历代人物 4.北大出版社电子书架 5.WaytoAGI 6.W3Schools 7.AI帮个忙 8.InsCode 9.文心一格 10.即使设计 11.AI绘画 12.无界AI 13.Midjourney中文站 14.其它 1.识典古籍 地址:识典古籍-古籍在线阅读平台 “识典古籍”是…