总结Java中的synchronized

news2025/1/12 6:11:47

在这里插入图片描述

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.coloradmin.cn/o/1618673.html

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

相关文章

光明与速度:AI网络中GPU与光模块的协奏曲

🎶在人工智能(AI)的世界里,GPU和光模块是实现高速计算和数据传输的关键。它们如同一场精心编排的交响乐,每个部分都不可或缺,共同创造出美妙的和谐。🎼 GPU:AI网络的心脏&#x1f4…

Python-GEE遥感云大数据分析、管理与可视化

原文链接:Python-GEE遥感云大数据分析、管理与可视化https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247601238&idx2&sn6b0557cf61451eaff65f025d648da869&chksmfa820db1cdf584a76de953b96519704177e6206d4ecd47a2f2fabbcac2f7ea619b0bce184…

MATLAB中roots函数用法

目录 语法 说明 示例 二次多项式的根 四次多项式的根 提示 roots函数的功能是求解多项式的根。 语法 r roots(p) 说明 r roots(p) 以列向量的形式返回 p 表示的多项式的根。输入 p 是一个包含 n1 多项式系数的向量,以 xn 系数开头。0 系数表示方程中不存…

Linux的学习之路:19、进程信号(1)

摘要 今天这张说一下信号的一部分知识 目录 摘要 一、信号 1、生活角度的信号 2、技术应用角度的信号 3、注意 4、用kill -l命令可以察看系统定义的信号列表 5、信号处理常见方式概览 二、产生信号 1、通过终端按键产生信号 2、调用系统函数向进程发信号 3、由软件…

Fisher判别:理解数据分类的经典方法

在机器学习和统计分类的领域中,Fisher判别(也称为Fisher线性判别分析)是一种非常重要的方法,旨在从数据中提取重要特征,以实现对样本的分类。即Fisher判别分析(Fisher Discriminant Analysis, FDA&#xff…

Midjourney-01 初试上手 注册使用并生成你的第一张AI图片 详细流程 提示词 过程截图 生成结果 付费文生图的天花板!

背景介绍 Midjourney是一款基于人工智能技术的绘画软件,利用深度学习算法来辅助用户进行绘画创作。这款软件能够通过用户输入的文本描述生成图像,支持多种生成方式,包括文字生成图片、图片生成图片和混合图片生成图片。 图像生成方式&#…

STM32之HAL开发——FSMC控制带控制器LCD(8080时序)

STM32FSMC模拟8080接口时序 ILI9341的8080通讯接口时序可以由STM32使用普通I/O接口进行模拟,但这样效率太低,STM32提供了一种特别的控制方法——使用FSMC接口实现8080时序。 由于FSMC外设可以用于控制扩展的外部存储器,而MCU对液晶屏的操作实…

Jackson 2.x 系列【31】Spring Boot 集成之字典翻译

有道无术,术尚可求,有术无道,止于术。 本系列Jackson 版本 2.17.0 本系列Spring Boot 版本 3.2.4 源码地址:https://gitee.com/pearl-organization/study-jaskson-demo 文章目录 1. 场景描述2. 案例演示2.1 修改枚举2.2 定义注解…

JVM垃圾收集器--分区收集器

G1收集器 G1(Garbage-First Garbage Collector)在 JDK 1.7 时引入,在 JDK 9 时取代 CMS 成为了默认的垃圾收集器。G1 有五个属性:分代、增量、并行、标记整理、STW。 分代 G1收集器 将内部分为多个大小相等的区域,另…

2024五一劳动节市集露营生活节活动策划方案

2024五一劳动节市集露营生活节(向野而生 躺平生活节主题)活动策划方案 方案页码:72页 文件格式:pptx 方案简介: 五一躺平生活节 咖啡一饮,书本一翻,轻松又自在,看着窗外的阳光,…

2024商业地产五一劳动节健康大会朋克养生市集活动策划方案

2024商业地产五一劳动节健康大会朋克养生市集(带薪健康 快乐打工主题)活动策划方案 活动策划信息: 方案页码:53页 文件格式:PPT 方案简介: 打工不养生 赚钱养医生 期待已久的五一假期, …

进口主食冻干高价是营销炒作还是物有所值?百利冻干真相揭秘分享

提及高端主食冻干,百利无疑也隶属其中。在各大平台上搜索“主食冻干”等相关词汇时,百利总能脱颖而出。在历次的双11、618等购物狂欢中,百利的销量都还不错。说明其高昂的价格也让许多宠物主人犹豫不决,只能等待大促时的优惠。那么…

【python】Python成语接龙游戏[1-3难度均有](源码+数据)【独一无二】

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

好友关注-实现分页查询收邮箱

9.5好友关注-实现分页查询收邮箱 需求:在个人主页的“关注”卡片中,查询并展示推送的Blog信息: 具体操作如下: 1、每次查询完成后,我们要分析出查询出数据的最小时间戳,这个值会作为下一次查询的条件 2…

Midjourney是什么?Midjourney怎么用?怎么注册Midjourney账号?国内怎么使用Midjourney?多人合租Midjourney拼车

Midjourney是什么 OpenAI发布的ChatGPT4引领了聊天机器人的竞争浪潮,随后谷歌推出了自己的AI聊天机器人Bard,紧接着微软推出了Bing Chat,百度也推出了文心一言,这些聊天机器人的推出,标志着对话式AI技术已经达到了一个…

每日一题 —— 最大子数组之和(动态规划)

1.链接 53. 最大子数组和 - 力扣&#xff08;LeetCode&#xff09; 2.描述 3.思路 4.参考代码 class Solution { public:int maxSubArray(vector<int>& nums) {int n nums.size();vector<int> dp(n1,0);int ret INT_MIN;for(int i 1;i<n;i){dp[i] ma…

pytest教程-29-重复执行用例插件-pytest-repeat

领取资料&#xff0c;咨询答疑&#xff0c;请➕wei: June__Go 上一小节我们学习了设置用例超时时间插件pytest-timeout&#xff0c;本小节我们讲解一下pytest重复执行用例插件pytest-repeat。 前言 做功能测试的时候&#xff0c;经常会遇到某个模块不稳定&#xff0c;偶然会…

STM32 I²C通信

一、IC总线通信 1.1 IC总线特点 IC&#xff08;Inter Integrated Circuit&#xff0c;集成电路总线&#xff09;&#xff0c;通过串行数据线SDA&#xff08;Serial Data&#xff09;和串行时钟线SCL&#xff08;Serial Clock&#xff09;来完成数据的传输。 特点&#xff1a;…

CentOS配置JDK8环境并安装配置neo4j

1. 工具安装 1. 安装wget yum install -y wget2. 安装vim yum install -y vim-enhanced2. 配置JDK 1. 安装JDK 先到官网下载jdk8的压缩包&#xff0c;点我传送&#xff0c;并将压缩包上传到虚拟机的/usr/local目录下。 cd /usr/local # 进入 /usr/local目录 tar -zxvf jdk-…

代码随想录算法训练营第20天 |654.最大二叉树、 617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树

代码随想录算法训练营第20天 |654.最大二叉树、 617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树 自己看到题目的第一想法看完代码随想录之后的想法自己实现过程中遇到哪些困难 链接: 654.最大二叉树 链接: 617.合并二叉树 链接: 700.二叉搜索树中的搜索 链接: 98.…