总结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…

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…

【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…

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

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

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

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

SpringCloud 与 Dubbo 的区别详解

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

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

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

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

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

(三)Servlet教程——Tomcat安装与启动

首先打开浏览器在浏览器地址栏中输入清华大学开源软件镜像站地址,地址如下 https://mirrors.tuna.tsinghua.edu.cn/ 输入地址后回车会出现如下图所示的界面 在该界面找tomcat不是很好找,在搜索框中输入apache然后回车,输入apache后并回车后出…

数控6面钻的优缺点

在木工、家具制造和建筑行业中,数控6面钻已成为一种革命性的工具。这种先进的机器以其高效、精准和多功能性受到了广大制造商的青睐。然而,就像任何技术产品一样,数控6面钻也有其优缺点。在本文中,我们将深入探讨数控6面钻的优缺点…

uboot中bootcmd 和 bootargs 环境变量

文章目录 一、bootcmd环境变量二、bootargs环境变量1.console2.root 三.uboot启动Linux测试方式1:从 EMMC 启动 Linux 系统方式2:从网络启动 Linux 系统 一、bootcmd环境变量 💦boot 中有两个非常重要的环境变量 bootcmd 和 bootargs。bootc…

Unity的Animator Animation的使用攻略

Animator 动画控制器 Animation 动画 动画片段 .anin 一、创建Animator 创建动画控制器 模型添加Animator组件 把控制器和模型绑定 二、创建动画 进入动画界面 创建动画片段anin 动画窗口分析 制作动画 点击录制, 移动子对象,在视窗 通过移动线来编辑关…

Kibana安装部署(Linux)

Kibana是Elasticsearch的开源可视化工具,与存储在Elasticsearch中的数据进行交互。 1. 下载软件 这里使用的Elasticsearch的版本是7.12.0,所以kibana选择同样的7.12.0版本。 官网下载地址:https://www.elastic.co/cn/downloads/past-releas…

基于SpringBoot的“幼儿园管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“幼儿园管理系统”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 个人信息界面图 缴费信息管理界…