当前位置: 首页 > news >正文

synchronized

⭐ 作者:小胡_不糊涂
🌱 作者主页:小胡_不糊涂的个人主页
📀 收录专栏:JavaEE
💖 持续更文,关注博主少走弯路,谢谢大家支持 💖

synchronized

  • 1. 特性
    • 1.1 互斥
    • 1.2 可重入
  • 2. 使用
    • 2.1 修饰代码块
    • 2.2 修饰普通方法
    • 2.3 修饰静态方法

1. 特性

1.1 互斥

synchronized 会起到互斥效果,某个线程执⾏到某个对象的 synchronized 中时,其他线程如果也执⾏到同⼀个对象synchronized 就会阻塞等待。
在这里插入图片描述

synchronized⽤的锁是存在Java对象头⾥的。可以粗略理解成,每个对象在内存中存储的时候,都存有⼀块内存表⽰当前的 “锁定” 状态(类似于厕所的 “有⼈/⽆⼈”)。
如果当前是 “⽆⼈” 状态,那么就可以使⽤,使⽤时需要设为 “有⼈” 状态;如果当前是"有⼈"状态,那么其他⼈⽆法使⽤,只能排队。

在这里插入图片描述

针对每⼀把锁,操作系统内部都维护了⼀个等待队列。当这个锁被某个线程占有的时候,其他线程尝试进⾏加锁,就加不上了,就会阻塞等待,⼀直等到之前的线程解锁之后,由操作系统唤醒⼀个新的线程,再来获取到这个锁。

注意:

  • 当上⼀个线程解锁之后,下⼀个线程并不是⽴即就能获取到锁,⽽是要靠操作系统来 “唤醒”,这也就是操作系统线程调度的⼀部分⼯作。
  • 假设有 A B C 三个线程,线程 A 先获取到锁,然后 B 尝试获取锁,然后 C 再尝试获取锁,此时 B 和 C都在阻塞队列中排队等待。但是当 A 释放锁之后,虽然 B ⽐ C 先来的,但是 B 不⼀定就能获取到锁,⽽是和 C 重新竞争,并不遵守先来后到的规则。

1.2 可重入

synchronized 同步块对同⼀条线程来说是可重⼊的,不会出现⾃⼰把⾃⼰锁死的问题。

什么情况下,会把自己锁死?
⼀个线程没有释放锁,然后⼜尝试再次加锁。
// 第⼀次加锁,加锁成功
// 第⼆次加锁,锁已经被占⽤,阻塞等待。
按照之前对于锁的设定,第⼆次加锁的时候,就会阻塞等待。直到第⼀次的锁被释放,才能获取到第⼆个锁。
但是释放第⼀个锁也是由该线程来完成,结果这个线程已经躺平了,啥都不想⼲了,也就⽆法进⾏解锁操作。这时候就会 死锁,这样的锁也就称为 不可重入锁

在可重⼊锁的内部, 包含了 “线程持有者” 和 “计数器” 两个信息。

  • 如果某个线程加锁的时候,发现锁已经被⼈占⽤,但是恰好占⽤的正是⾃⼰,那么仍然可以继续获取到锁,并让计数器自增。
  • 解锁的时候计数器递减为 0 的时候,才真正释放锁。(才能被别的线程获取到)

2. 使用

synchronized 本质上要修改指定对象的 “对象头”。从使⽤⻆度来看,synchronized 也势必要搭配⼀个具体的对象来使⽤。

2.1 修饰代码块

明确指定锁哪个对象

//锁任意对象
public class SynchronizedDemo {private Object locker = new Object();public void method() {synchronized (locker) {}}
}
//锁当前对象
public class SynchronizedDemo {public void method() {synchronized (this) {}}
}

2.2 修饰普通方法

锁的 SynchronizedDemo 对象

public class SynchronizedDemo {public synchronized void methond() {}
}

2.3 修饰静态方法

锁的 SynchronizedDemo 类的对象

public class SynchronizedDemo {public synchronized static void method() {}
}

两个线程竞争同⼀把锁,才会产⽣阻塞等待。
两个线程分别尝试获取两把不同的锁,不会产⽣竞争。

相关文章:

synchronized

⭐ 作者:小胡_不糊涂 🌱 作者主页:小胡_不糊涂的个人主页 📀 收录专栏:JavaEE 💖 持续更文,关注博主少走弯路,谢谢大家支持 💖 synchronized 1. 特性1.1 互斥1.2 可重入 …...

Vue在页面上添加水印

第一步:在自己的项目里创建一个js文件;如图所示我在在watermark文件中创建了一个名为waterMark.js文件。 waterMark.js /** 水印添加方法 */ let setWatermark (str1, str2) > {let id 1.23452384164.123412415if (document.getElementById(id) …...

SQL server 数据库练习题及答案(练习2)

使用你的名字创建一个数据库 创建表: 数据库中有三张表,分别为student,course,SC(即学生表,课程表,选课表) 问题: --1.分别查询学生表和学生修课表中的全部数据。--2.查询成绩在70到80分之间…...

minicube搭建golang容器服务

引言 最近在自己电脑上搭建一个小型k8s环境,以学习云原生相关内容。这里我主要分为三部分记录: 容器及容器编排理论环境安装相关rpcx服务实战 还在调试中,先总结整理下,这里后续补充上我的github工程链接。 一、容器及容器编排理…...

图片批量处理:图片批量缩放,高效调整尺寸的技巧

在数字媒体时代,图片处理已是日常生活和工作中不可或缺的一部分。有时候要批量处理图片,如缩放图片尺寸,以满足不同的应用需求。现在一起来看看办公提效式具如何高效的将图片批量处理方法,快速、准确地批量调整图片尺寸操作。 下…...

直接插入排序【从0-1学数据结构】

文章目录 💗 直接插入排序Java代码C代码JavaScript代码稳定性时间复杂度空间复杂度 我们先来学习 直接插入排序, 直接排序算是所有排序中最简单的了,代码也非常好实现,尽管直接插入排序很简单,但是我们依旧不可以上来就直接写代码,一定要分析之后才开始写,这样可以提…...

C++/CLI——1简介

C/CLI——1简介 如果你是.net程序员,不免会用到C/C写的库。对于简单的调用,可以直接使用DllImport来完成就可以,详情可参考C#调用C/C从零深入讲解。但是对于复杂的C类和对象,尤其是类似于OCC的大型C项目,DllImport可能…...

C#实现串口通讯

1、官网下载Launch Virtual Serial Port Driver Virtual Serial Port Driver - create and emulate virtual COM port,开个虚拟串口: Pair模式(一对,成双成对的意思,就是COM1向COM2传或者COM2向COM1,好比两台机器的CO…...

NLP论文阅读记录 - 以大语言模型为参考学习总结

文章目录 前言0、论文摘要一、Introduction1.1目标问题1.2相关的尝试1.3本文贡献 二.相关工作2.1文本生成模型的训练方法2.2 基于LLM的自动评估2.3 LLM 蒸馏和基于 LLM 的数据增强 三.本文方法3.1 Summarize as Large Language Models3.1.1 前提3.1.2 大型语言模型作为参考具有…...

前端---资源路径

当我们使用img标签显示图片的时候&#xff0c;需要指定图片的资源路径&#xff0c;比如: <img src"images/logo.png">这里的src属性就是设置图片的资源路径的&#xff0c;资源路径可以分为相对路径和绝对路径。 1. 相对路径 从当前操作 html 的文档所在目录算…...

【2024考研】心情记录

今天是12.26日。距离24考研已经过去了2天&#xff0c;自认为缓过来了&#xff0c;故写下这篇文章。 25日早上简单过了一下答案&#xff0c;但实在是记不住答案了&#xff0c;不知道是我的脑子抵触还是怎的&#xff0c;像一块灰色的布遮住了我的记忆&#xff0c;羞于打开&#x…...

MySQL数据库日志管理和数据的备份及恢复

目录 MySQL日志管理 数据库备份的重要性 数据库备份的分类 从物理与逻辑的角度 从数据库的备份策略角度 常见的备份方法 物理冷备 专用备份工具mysqldump或mysqlhotcopy 启用二进制日志进行增量备份 第三方工具备份 MySQL完全备份与恢复 MySQL完全备份 物理冷备份与…...

node-schedule nodejs定时提醒(并判断段是否是工作日)

概述 工作中有个需求&#xff1a;在特定的时间发送一些消息&#xff0c;也就是说比如在每天的7点发送消息&#xff1a;该起床了。一开始我想用定时器每分钟每分钟的去查当前时间&#xff0c;但好像有点蠢&#xff0c;然后我找到了这个包 使用方法 安装 npm install node-sc…...

LeetCode 75| 前缀和

目录 1732 找到最高海拔 724 找到数组的中心下标 1732 找到最高海拔 class Solution { public:int largestAltitude(vector<int>& gain) {int res 0;int sum 0;for(int num : gain){sum num;res max(res,sum);}return res;} }; 时间复杂度O(n) 空间复杂度O(…...

智能,轻量,高效的爬虫工具 (爬虫宝第一代), HSpider

场景 之前玩爬虫宝一时爽&#xff0c;但是我很快发现了一个致命的问题。就是chat3.5 有时候误判&#xff0c;Claude2 是遇到大一点的html就无法解析&#xff0c;chat4 Api没有申请下来&#xff0c;chat3.5 误判这个可以纠正&#xff0c;但是每次爬取花费的钱都是2刀以上&#…...

IDEA Maven Helper插件 解决jar冲突

Jar包冲突报错 程序抛出java.lang.ClassNotFoundException异常&#xff1b; 程序抛出java.lang.NoSuchMethodError异常&#xff1b; 程序抛出java.lang.NoClassDefFoundError异常&#xff1b; 程序抛出java.lang.LinkageError异常等&#xff1b;Maven Jar包管理机制 在Maven项…...

装饰 Web3 项目的用户交互界面(Web3项目二实战之四)

用户交互界面是Web3项目必不可少的,毕竟,Web3项目最终是面向用户的,所以,Web3项目总得需要一个优美的UI界面,已达到用户在视觉上精彩盛宴。 诚然,一个Web3项目若到了用户交互界面,大体上,这个Web3项目也将告一段落了。 没错,Web3第二个项目,也将终结于本篇,顺势拉开…...

【数据库系统概论】第3章-关系数据库标准语言SQL(3)

文章目录 3.5 数据更新3.5.1 插入数据3.5.2 修改数据3.5.3 删除数据 3.6 空值的处理3.7 视图3.7.1 建立视图3.7.2 查询视图3.7.3 更新视图3.7.4 视图的作用 3.5 数据更新 3.5.1 插入数据 注意&#xff1a;插入数据时要满足表或者列的约束条件&#xff0c;否则插入失败&#x…...

理解io/nio/netty

一、io io即input/output&#xff0c;输入和输出 1.1 分类 输入流、输出流&#xff08;按数据流向&#xff09; 字节流&#xff08;InputStream/OutputStream&#xff08;细分File/Buffered&#xff09;&#xff09;、字符流(Reader/Writer&#xff08;细分File/Buffered/pu…...

旅游品牌网站搭建的作用是什么

我国旅游业规模非常高&#xff0c;各地大小旅游景区也是非常多&#xff0c;尤其节假日更是可以达到峰值&#xff0c;无论周边游还是外地游对所要去的景区&#xff0c;消费者总是需要来回了解很多&#xff0c;浏览器查或旅行社咨询等。 对旅游企业而言&#xff0c;传统线下方式…...

javaweb企业员工公务车辆管理系统

目录同行可拿货,招校园代理 ,本人源头供货商功能模块划分用车流程管理数据统计与报表系统管理功能技术实现要点项目技术支持源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作同行可拿货,招校园代理 ,本人源头供货商 功能模块划分 员工管理模…...

第三届“数信杯”数据安全大赛wp之数据恢复

第三届“数信杯”数据安全大赛wp之数据恢复 缘起 先说实话&#xff0c;这道题比赛时没做出来&#x1f634; RSA题目一直是我的软肋&#xff0c;一般我都是放到最后去碰运气&#xff0c;这道题也是我第一次遇到&#xff0c;想借这次机会好好学习一下。 这里有2个基本概念&am…...

【全球首批C++27静态反射商用项目解密】:西门子PLC配置引擎重构实测——编译时间+12%,运行时内存下降93.7%

第一章&#xff1a;C27静态反射工业应用案例C27引入的静态反射&#xff08;Static Reflection&#xff09;核心特性——基于std::reflexpr与编译期元对象模型&#xff08;Meta Object Model, MOM&#xff09;——已进入关键工业验证阶段。多家汽车电子与工业控制厂商在AUTOSAR …...

wUU代码混淆实战指南:使用Obfuscar构建坚不可摧的安全防线

在当今数字化时代&#xff0c;保护.NET应用程序的源代码安全变得尤为重要。你是否担心自己的知识产权被轻易窃取&#xff1f;是否希望防止竞争对手通过反编译分析你的核心业务逻辑&#xff1f;今天&#xff0c;我将为你详细介绍一款强大的开源混淆工具——Obfuscar&#xff0c;…...

新手福音:通过快马生成图文并茂的ccswitch安装教程代码,轻松上手

最近在折腾一个叫ccswitch的工具&#xff0c;作为刚入门的新手&#xff0c;真的被各种环境配置搞得头大。好在发现了InsCode(快马)平台&#xff0c;它能直接生成带详细注释的安装教程代码&#xff0c;简直是救命稻草&#xff01;今天就把这个图文并茂的教程项目分享给大家。 c…...

MCP3302/MCP3304 13位差分ADC驱动开发与硬件协同设计指南

1. MCP330X库深度解析&#xff1a;面向嵌入式工程师的13位差分ADC驱动开发指南MCP330X系列Arduino库是专为Microchip MCP3302与MCP3304高精度模数转换器设计的底层驱动框架。该库并非简单封装&#xff0c;而是基于对SPI协议时序、ADC采样原理及嵌入式资源约束的深刻理解所构建的…...

从Flash到I2C:盘点那些让你头疼的时序图符号,并教你用Python+逻辑分析仪自动解析

从Flash到I2C&#xff1a;时序图符号解析与Python自动化实战 第一次翻开某款Flash芯片的数据手册时&#xff0c;我被密密麻麻的时序图符号彻底击垮了。灰色交叉、斜坡箭头、省略号标记...这些看似简单的图形背后&#xff0c;隐藏着芯片厂商精心设计的通信规则。作为嵌入式开发者…...

前端小游戏实战:用JavaScript给爱心粒子添加点击互动效果

前端小游戏实战&#xff1a;用JavaScript给爱心粒子添加点击互动效果 当静态的爱心粒子在屏幕上跳动时&#xff0c;你是否想过让它对你的每一次点击做出回应&#xff1f;本文将带你从零开始&#xff0c;用JavaScript为爱心粒子系统添加点击生成、拖拽交互等动态效果&#xff0c…...

用MATLAB搞定模电实验:单管共射放大电路静态工作点与放大倍数的保姆级仿真

MATLAB仿真单管共射放大电路&#xff1a;从理论到实践的完整指南 引言 在电子工程领域&#xff0c;单管共射放大电路是模拟电路设计的基石之一。传统实验教学中&#xff0c;学生往往需要花费大量时间搭建实体电路、调整参数并测量数据&#xff0c;这不仅效率低下&#xff0c;…...

LangChain-AI应用开发框架(四)

目录 一.LangChain软件包安装 二.LangChain能力详解 1.本章节环境说明 2.目标与内容 三.详细过程 1.步骤1&#xff1a; a.申请API key并配置环境变量 b.配置环境变量 步骤2:定义大模型 a.安装OpenAI包 b.定义大模型 步骤3&#xff1a;定义消息列表 步骤4&#xff…...