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

【Synchronized】不同的使用场景和案例

【Synchronized】不同的使用场景和案例

  • 【一】锁的作用范围与锁对象
    • 【1】实例方法(对象锁)
    • 【2】静态方法(类锁)
    • 【3】代码块(显式指定锁对象)
    • 【4】类锁(通过Class对象显式锁定)
  • 【二】核心区别总结
  • 【三】关键注意事项
    • 【1】内存可见性
    • 【2】避免死锁
    • 【3】锁粒度过大问题
  • 【四】测试案例补充
  • 【五】原理
    • 【1】Synchronized锁原理
      • (1)对象头
      • (2)监视器(Monitor)
      • (3)字节码层面的实现
    • 【2】锁升级原理
      • (1)无锁状态
      • (2)偏向锁
      • (3)轻量级锁
      • (4)重量级锁
    • 【3】总结

【一】锁的作用范围与锁对象

【1】实例方法(对象锁)

(1)锁对象:当前实例(this)。
(2)作用范围:同一实例的多个线程访问同步方法时互斥;不同实例的同步方法互不影响。
(3)测试案例:

public class BankAccount {private int balance = 1000;public synchronized void withdraw(int amount) {if (balance >= amount) {balance -= amount;}}
}// 测试代码
BankAccount account1 = new BankAccount();
BankAccount account2 = new BankAccount();// 线程1操作account1的withdraw方法(互斥)
new Thread(() -> account1.withdraw(500)).start();
// 线程2操作account1的withdraw方法(被阻塞)
new Thread(() -> account1.withdraw(500)).start();
// 线程3操作account2的withdraw方法(不受影响)
new Thread(() -> account2.withdraw(500)).start();

(4)结果:线程1和线程2对account1的操作互斥;线程3与account1的操作无关

【2】静态方法(类锁)

(1)锁对象:类的Class对象(如BankAccount.class)。
(2)作用范围:所有实例调用静态同步方法时互斥。
(3)测试案例:

public class OrderService {private static int orderCount = 0;public static synchronized void generateOrder() {orderCount++;}
}// 测试代码
OrderService instanceA = new OrderService();
OrderService instanceB = new OrderService();// 线程1调用静态方法(互斥)
new Thread(() -> OrderService.generateOrder()).start();
// 线程2调用静态方法(被阻塞)
new Thread(() -> OrderService.generateOrder()).start();
// 线程3通过实例调用静态方法(同样被阻塞)
new Thread(() -> instanceA.generateOrder()).start();

(4)结果:所有线程调用generateOrder()都会竞争同一把类锁,无论通过类名还是实例调用。

【3】代码块(显式指定锁对象)

(1)锁对象:任意显式指定的对象(如实例变量、类对象)。
(2)作用范围:仅同步代码块内的操作,锁粒度更细。
(3)测试案例:

public class CacheManager {private final Object lock = new Object();private int cacheSize = 0;public void updateCache() {// 非同步代码System.out.println("非同步操作");synchronized(lock) { // 显式锁定lock对象cacheSize++;}}
}// 测试代码
CacheManager manager = new CacheManager();
// 线程1和线程2竞争lock对象的锁
new Thread(() -> manager.updateCache()).start();
new Thread(() -> manager.updateCache()).start();

(4)结果:仅代码块内的cacheSize++操作互斥,其他代码可并发执行347。

【4】类锁(通过Class对象显式锁定)

(1)锁对象:类的Class对象(如ClassName.class)。
(2)作用范围:与静态方法锁效果一致,但可用于非静态方法中。
(3)测试案例:

public class LockDemo {public void classLockBlock() {synchronized(LockDemo.class) { // 显式锁定类对象// 同步代码}}
}// 线程1和线程2调用classLockBlock方法时互斥
LockDemo obj1 = new LockDemo();
LockDemo obj2 = new LockDemo();
new Thread(() -> obj1.classLockBlock()).start();
new Thread(() -> obj2.classLockBlock()).start();

(4)结果:不同实例调用classLockBlock时仍互斥,因为锁的是LockDemo.class

【二】核心区别总结

锁类型 锁对象 作用范围 适用场景
实例方法(对象锁) 当前实例(this) 同一实例的同步方法 保护实例变量(如账户余额)
静态方法(类锁) 类的Class对象 所有实例的静态方法 保护静态变量(如全局计数器)
显式对象锁 指定对象(如lock) 锁定指定对象的同步代码块 细粒度控制(如缓存更新)
显式类锁 ClassName.class 跨实例同步(与静态方法锁等效) 需要全局同步的非静态方法逻辑

【三】关键注意事项

【1】内存可见性

实例锁仅保证同一实例内的变量可见性。
类锁保证所有实例间的变量可见性(因Class对象在方法区共享)。

【2】避免死锁

按固定顺序获取锁(如先锁A再锁B)。
避免嵌套锁(如synchronized方法内调用另一个synchronized方法时需谨慎)。

【3】锁粒度过大问题

错误示例:将耗时操作(如IO)放在同步方法内。
优化方案:仅同步关键代码块

【四】测试案例补充

场景:对象锁与类锁的互斥性测试

public class MixedLockDemo {public synchronized void instanceMethod() {// 实例锁}public static synchronized void staticMethod() {// 类锁}
}// 线程1调用实例方法,线程2调用静态方法
MixedLockDemo obj = new MixedLockDemo();
new Thread(() -> obj.instanceMethod()).start();  // 锁obj实例
new Thread(() -> MixedLockDemo.staticMethod()).start();  // 锁MixedLockDemo.class

结果:两个线程不会互斥,因为实例锁和类锁是独立的

【五】原理

【1】Synchronized锁原理

(1)对象头

在 Java 中,每个对象都有一个对象头(Object Header),对象头中包含了一些与对象自身相关的信息,如哈希码、分代年龄等,同时也包含了锁的相关信息。对象头的结构在不同的 JVM 实现中可能会有所不同,但通常会包含一个 Mark Word 字段,这个字段用于存储对象的锁状态、哈希码等信息。

(2)监视器(Monitor)

synchronized 关键字的底层实现依赖于监视器(Monitor)。监视器是 Java 中实现同步的基础,它是一个同步工具,相当于一个特殊的房间,线程进入这个房间就相当于获得了锁,其他线程则需要等待。每个 Java 对象都可以关联一个监视器,当一个线程试图访问被 synchronized 修饰的代码块或方法时,它会首先尝试获取该对象的监视器。

(3)字节码层面的实现

当使用 synchronized 修饰代码块时,编译后的字节码会包含 monitorenter 和 monitorexit 指令。例如:

public class SynchronizedExample {public void test() {synchronized (this) {// 同步代码块}}
}

编译后的字节码中会包含如下指令:

monitorenter
// 同步代码块的字节码
monitorexit

(1)monitorenter 指令
当线程执行到 monitorenter 指令时,它会尝试获取对象的监视器。如果监视器的进入计数器为 0,表示该监视器没有被其他线程持有,当前线程可以获取该监视器,并将进入计数器加 1。如果监视器已经被其他线程持有,当前线程会被阻塞,直到该监视器被释放。

(2)monitorexit 指令
当线程执行到 monitorexit 指令时,它会将监视器的进入计数器减 1。当进入计数器为 0 时,表示当前线程已经释放了该监视器,其他线程可以尝试获取该监视器。

当使用 synchronized 修饰方法时,编译后的字节码会在方法的访问标志中设置 ACC_SYNCHRONIZED 标志。当线程调用该方法时,会自动检查该标志,如果设置了该标志,线程会首先尝试获取该方法所属对象的监视器,然后再执行方法体。

【2】锁升级原理

在 Java 6 之前,synchronized 是一个重量级锁,性能较低。为了提高性能,Java 6 引入了锁升级机制,使得 synchronized 的性能有了显著提升。锁升级的过程是一个逐步升级的过程,从无锁状态开始,经过偏向锁、轻量级锁,最终升级为重量级锁。

(1)无锁状态

对象刚被创建时,处于无锁状态,Mark Word 中存储的是对象的哈希码、分代年龄等信息。

(2)偏向锁

(1)原理:偏向锁是为了在没有竞争的情况下减少锁的获取和释放带来的性能开销。当一个线程第一次访问被 synchronized 修饰的代码块或方法时,会在对象头的 Mark Word 中记录该线程的 ID,这个过程称为偏向锁的获取。以后该线程再次进入该同步代码块时,无需进行任何同步操作,直接进入代码块执行,这样可以避免频繁的锁获取和释放操作,提高性能。

(2)升级条件:当有其他线程尝试竞争该偏向锁时,偏向锁会升级为轻量级锁。

(3)轻量级锁

(1)原理:当线程获取轻量级锁时,会在当前线程的栈帧中创建一个锁记录(Lock Record),并将对象头的 Mark Word 复制到锁记录中。然后,线程尝试使用 CAS(Compare-And-Swap)操作将对象头的 Mark Word 替换为指向锁记录的指针。如果替换成功,说明该线程成功获取了轻量级锁;如果替换失败,说明有其他线程正在竞争该锁,当前线程会尝试自旋等待锁的释放。

(2)升级条件:如果自旋次数达到一定阈值(通常由 JVM 动态调整),或者有多个线程同时竞争该锁,轻量级锁会升级为重量级锁。

(4)重量级锁

原理:重量级锁依赖于操作系统的互斥量(Mutex)来实现,当线程获取重量级锁失败时,会被阻塞,进入等待队列,直到锁被释放。重量级锁的性能开销较大,因为线程的阻塞和唤醒需要操作系统进行上下文切换,这会消耗较多的 CPU 时间。

【3】总结

synchronized 锁的实现原理基于对象头和监视器,通过 monitorenter 和 monitorexit 指令或 ACC_SYNCHRONIZED 标志来实现线程同步。锁升级原理是为了在不同的竞争情况下选择合适的锁状态,以提高性能。在无竞争的情况下,使用偏向锁;在有少量竞争的情况下,使用轻量级锁;在竞争激烈的情况下,使用重量级锁。

相关文章:

【Synchronized】不同的使用场景和案例

【Synchronized】不同的使用场景和案例 【一】锁的作用范围与锁对象【1】实例方法(对象锁)【2】静态方法(类锁)【3】代码块(显式指定锁对象)【4】类锁(通过Class对象显式锁定) 【二】…...

华为欧拉操作系统安装Docker服务

华为欧拉 20.03 操作系统安装 Docker 服务 一、安装前准备 系统环境检查 确认当前运行的操作系统为华为欧拉 24.03。可通过在终端执行以下命令查看: cat /etc/os - release欧拉系统可以使用以下命令: cat /etc/openEuler-release确保系统已连接互联…...

告别复杂日志解析 用bin2sql轻松实现MySQL数据闪回

mysqlbinlog⼯具使用 use test; CREATE TABLE t1 (id INT(11) NOT NULL AUTO_INCREMENT,name VARCHAR(20) DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;INSERT INTO t1(id, name) SELECT 101, tome101; INSERT INTO t1(id, name) SELECT 102, tome1…...

uniapp简单table表

<template><view class"container"><scroll-view scroll-x"true" scroll-y"true" class"table-scroll"><view class"table-header"><view class"table-cell fixed-column">序号<…...

prompt大师高效提示词解析

Prompt大师李继刚高效提示词示例解析 一、「汉语新解」提示词 核心结构 采用Lisp语言框架嵌套中文语义&#xff0c;通过(defun 新汉语老师 ()...)定义角色风格&#xff08;融合奥斯卡王尔德、鲁迅的批判性语言&#xff09;&#xff0c;用(隐喻 (一针见血...))构建解释逻辑链。…...

uni-app如何发布项目为app_2025

参考大佬的&#xff1a;uni-app项目打包成apk&#xff08;本地打包篇&#xff09;_uniapp打包apk-CSDN博客 1、导入前配置 在 HBuilder X 中打开uni-app项目中的 mainifest.json 文件&#xff0c;appid没有的话可以点“重新获取” 2、打包 然后关注控制台&#xff0c;导出成功…...

MySQL与Canal、RabbitMQ集成指南

MySQL 部分 1. 查看是否开启 binlog MySQL 8 默认开启 binlog。可以通过以下命令查看是否开启&#xff1a; SHOW VARIABLES LIKE log_bin;如果返回结果为 ON&#xff0c;则表示 binlog 已开启。 Variable_nameValuelog_binON 2. 若未开启 binlog&#xff0c;则需手动配置 …...

新品发布|启英泰伦联合启明云端推出离在线语音大模型方案

当前&#xff0c;生成式大模型正以颠覆性姿态重塑人机交互的边界&#xff0c;并逐渐向终端场景渗透。然而&#xff0c;云端大模型在落地终端场景时面临两大挑战&#xff1a; 在真实噪声场景下容易听不清、误识别&#xff0c;影响交互准确性&#xff1b;云端处理冗余数据及大规…...

网编高级 day01

网编高级 day01 0. 大纲1. Modbus协议1.1. Modbus起源1.2. 分类1.3. Modbus TCP特点 2. Modbus TCP协议格式2.1. 报文头2.2. 寄存器2.3. 功能码 0. 大纲 协议&#xff1a; modbus协议&#xff1a;modbus TCP、modbus RTUhtml 网页&#xff1a;http协议Webserver 工具&#x…...

2001-2023年上市公司数字化转型年报词频统计(年报词频统计和MDA词频统计两种方式)(吴非、赵宸宇、甄红线300+关键词三种方法)

2001-2023年上市公司数字化转型年报词频统计&#xff08;年报词频统计和MD&A词频统计两种方式&#xff09;&#xff08;吴非、赵宸宇、甄红线300关键词三种方法&#xff09; 1、时间&#xff1a;2001-2023年 2、来源&#xff1a;上市公司年报 3、参考文献&#xff1a; …...

数据分析与AI丨AI Fabric:数据和人工智能架构的未来

AI Fabric 架构是模块化、可扩展且面向未来的&#xff0c;是现代商业环境中企业实现卓越的关键。 在当今商业环境中&#xff0c;数据分析和人工智能领域发展可谓日新月异。几乎每天都有新兴技术诞生&#xff0c;新的应用场景不断涌现&#xff0c;前沿探索持续拓展。可遗憾的是&…...

MQ消息发送不在MySQL事务中,该如何保证一致性?

在 MQ 消息发送与 MySQL 事务分离的场景下&#xff0c;可通过以下方案保障数据一致性&#xff1a; 一、核心原则 确保 业务操作成功 与 消息发送成功 的最终一致性&#xff0c;避免因网络抖动、服务宕机等异常导致以下问题&#xff1a; 场景1&#xff1a;业务操作成功但消息未…...

[rust] rust学习

rust学习 1. 项目组织结构 工程 # 创建一个工程 cargo new my-project工作空间 在 Rust 中&#xff0c;工作空间&#xff08;Workspace&#xff09; 是一个包含多个 Rust 项目的共享环境&#xff0c;用于管理多个 crate&#xff08;库或可执行文件&#xff09;。它允许多个…...

艾尔登复刻Ep1——客户端制作、场景切换、网络控制

需要添加的插件内容 Netcode for GameObjects&#xff1a;是一个为 Unity 游戏开发提供高级网络功能的 SDK。它的主要作用是允许开发者在其 GameObject 和 MonoBehaviour 工作流中集成网络功能&#xff0c;并且可以与多种底层传输层协议兼容。 具体内容请看&#xff1a;https:…...

正则表达式(复习)

文章目录 一、[]: 一个字符集合二、{}: 重复次数三、特殊符号四、(): 分组五、python代码示例六、注意 正则表达式(regular expression)描述了一种字符串匹配的模式&#xff08;pattern&#xff09;&#xff0c;可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个…...

密码学笔记

密码学 一、密码学基础概念 1. CIA三要素 机密性 (Confidentiality)&#xff1a;信息不被未授权者访问。 例子&#xff1a;用钥匙锁住日记本&#xff0c;只有你有钥匙。 完整性 (Integrity)&#xff1a;信息在传输/存储中不被篡改。 例子&#xff1a;快递包裹封条&#xff0c…...

C#结构体(Struct)详解

在 C# 中&#xff0c;‌结构体&#xff08;struct&#xff09;‌ 是一种值类型数据类型&#xff0c;适用于封装小型数据组。与类&#xff08;class&#xff09;不同&#xff0c;结构体在栈&#xff08;Stack&#xff09;上分配内存&#xff0c;且赋值时会发生值复制。以下是结构…...

Tomato靶机通关攻略

1.安装并开启靶机 2.用Kali查询靶机IP Kali 的IP 靶机的IP 3.访问靶机 4.用御剑扫描端口 5.获取敏感目录 分别访问三个目录 6.查看目录 发现info.php并进入 查看源码&#xff0c;发现文件包含漏洞 利用漏洞查看日志文件 http://192.168.40.139/antibot_image/antibots/info…...

Go Ebiten小游戏开发:俄罗斯方块

在这篇文章中&#xff0c;我们将一起开发一个简单的俄罗斯方块游戏&#xff0c;使用Go语言和Ebiten游戏库。Ebiten是一个轻量级的游戏库&#xff0c;适合快速开发2D游戏。我们将逐步构建游戏的基本功能&#xff0c;包括游戏逻辑、图形绘制和用户输入处理。 项目结构 我们的项…...

Github 2025-03-12 C开源项目日报Top5

根据Github Trendings的统计,今日(2025-03-12统计)共有5个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量C项目5C++项目1Lean的LEDE源码:为国产龙芯LOONGSON SoC loongarch64/飞腾Phytium腾锐2000系列架构添加支持 创建周期:2338 天开发语言:C协议类…...

【机器学习-基础知识】统计和贝叶斯推断

1. 概率论基本概念回顾 1. 概率分布 定义: 概率分布(Probability Distribution)指的是随机变量所有可能取值及其对应概率的集合。它描述了一个随机变量可能取的所有值以及每个值被取到的概率。 对于离散型随机变量,使用概率质量函数来描述。对于连续型随机变量,使用概率…...

Unity3D 着色器优化(Shader Optimization)

前言 Unity3D 着色器&#xff08;Shader&#xff09;优化是提升渲染性能的关键环节&#xff0c;尤其是在移动设备或复杂场景中。以下是系统的优化策略和实践建议&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&#xff0c;希望大家可以点击进来一起交流一下开发经…...

基于SpringBoot的“体育购物商城”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“体育购物商城”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统总体模块设计 前台用户登录界面 系统首页界面…...

数据库约束

数据库约束 1. NULL约束2. UNIQUE&#xff1a;唯一约束3. DEFAULT&#xff1a;默认值约束4. PRIMARY KEY&#xff1a;主键约束5. FOREIGN KEY&#xff1a;外键约束6. CHECK约束 数据库约束是关系型数据库的一个重要功能&#xff0c;主要作用是保证数据的正确性&#xff0c;也就…...

【经典算法】Leetcode-零钱兑换问题

一、题目 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -1 。你可以认为每种硬币的数量是无限的…...

Go 语言使用Protobuf 进行序列化详解

文章目录 Go 语言使用Protobuf 进行序列化详解1. Protobuf是什么?2. 安装Protobuf 及 Go 依赖3. 编写.proto 文件4. 实现序列化和反序列化 Go 语言使用Protobuf 进行序列化详解 1. Protobuf是什么? 以下是 Protobuf 官方中文文档的概述: Protobuf(Protocol Buffers) 是一种…...

Windows控制台函数:标准输入输出流交互函数GetStdHandle()

目录 什么是 GetStdHandle&#xff1f; 它长什么样&#xff1f; 怎么用它&#xff1f; 它跟 std::cout 有什么不一样&#xff1f; GetStdHandle 是一个 Windows API 函数&#xff0c;用于获取标准输入、标准输出或标准错误设备的句柄。它定义在 Windows 的核心头文件 <…...

自然语言处理初学者指南

文章目录 一、说明二、自然语言处理发展史2.1 最早的自然语言处理简介2.2 历史2.3 NLP 的早期工作 三、NLP的现代方法3.1 单词编码3.2 循环神经网络3.3 强化学习3.4 深度学习 四、更进一步的方法 一、说明 对于初学者来说&#xff0c;自然语言处理的发展历史非常有必要了解&am…...

Kubernetes教程(七)了解集群、标签、Pod和Deployment

了解集群、标签、Pod和Deployment 一、K8s资源对象二、K8s集群1. Master2. Node 三、Namespace&#xff08;命名空间&#xff09;四、Label&#xff08;标签&#xff09;五、Pod1. 共享网络命名空间2. 共享数据 六、工作负载1. 设置副本数2. 应用升级 结语 Kubernetes的知识真的…...

【BUG分析】微服务无法读取Nacos中的共享配置

项目场景 基于Spring Cloud微服务的商城系统。 使用Nacos进行统一配置管理&#xff0c;在bootstrap.xml中读取配置参数。 问题描述 购物车微服务可以读取Nacos中的共享mybatis配置&#xff0c;商品管理微服务却读不到&#xff0c;启动报错提示无法配置数据库源&#xff1a; …...

SpringMVC (一)基础

目录 SpringMVC 一 简单使用 1 新建模块选择指定参数 2 创建实现类 3 将项目启动 4 运行结果&#xff1a;在浏览器当中响应执行 二 RequestMapping 三 请求限定 SpringMVC SpringMVC是Spring的web模块&#xff0c;用来开发Web应用&#xff0c;SpringMVC应用最终作为B/…...

【ES6】ES6中的类

基础定义和使用 class Animal {constructor(name, species, age) {this.name namethis.species speciesthis.age age} }let dog new Animal("Spot", "Dog", 4)私有变量 变量名前带#即可。 Getter 和Setter方法 继承 // 父类 class Point{construc…...

兴达易控Profinet 转 ModbusTCP跨网段通信模块

Profinet 转 ModbusTCP/跨网段通信模块 Profinet转ModbusTCP/跨网段通信模块&#xff0c;作为现代工业自动化系统中不可或缺的重要组件&#xff0c;正日益受到广泛关注和应用。 这种模块的核心功能是将Profinet网络协议转换为Modbus TCP协议&#xff0c;实现不同网络之间的无缝…...

linux 的免密切换用户PAM配置

/etc/pam.d/su是Linux系统中与用户切换&#xff08;su命令&#xff09;相关的PAM&#xff08;Pluggable Authentication Modules&#xff0c;可插拔认证模块&#xff09;配置文件。以下是对它的详细介绍&#xff1a; 简介 作用 PAM是一种用于管理系统认证的机制&#xff0c;…...

使用 Python pandas操作 Excel 文件

使用 Python pandas 操作 Excel 文件 flyfish pandas 是 Python 中一个强大的数据处理和分析库&#xff0c;它提供了丰富的数据结构&#xff08;如 Series 和 DataFrame&#xff09;和数据操作方法&#xff0c;能够方便地处理各种数据格式&#xff0c;包括 Excel 文件。 安装…...

UE5.5 Niagara 发射器粒子更新模块

Particle State &#xff08;粒子状态&#xff09;模块 Particle State 主要用于控制粒子的生存状态&#xff0c;包括死亡、消失、响应事件等。 Particle State Kill Particles When Lifetime Has Elapsed 当粒子的生命周期结束时&#xff0c;销毁这些粒子。 Lifetime &…...

状态模式的C++实现示例

核心思想 状态模式&#xff08;State Pattern&#xff09; 是一种行为设计模式&#xff0c;允许对象在其内部状态改变时改变其行为。它将状态相关的逻辑分散到不同的状态类中&#xff0c;避免了使用大量的条件语句来处理不同状态下的行为。 状态抽象化&#xff1a;将对象的状…...

ThinkPHP8.0+MySQL8.0搭建简单实用电子证书查询系统

客户花了100元买了一个系统&#xff0c;开始不能导入&#xff0c;到处找人帮忙解决。给解决能导入了&#xff0c;不能修改&#xff0c;满足不了用户的需求。用户一狠心&#xff0c;花200块钱&#xff0c;叫我给他定制了一个电子证书查询系统。还免费给部署到服务器。惭愧惭愧……...

STM32全系大阅兵(2)

接前一篇文章:STM32全系大阅兵(1) 本文内容参考: STM32家族系列的区别_stm32各个系列区别-CSDN博客 STM32--STM32 微控制器详解-CSDN博客...

upload-labs通关攻略 【Pass-01~Pass-19】

注意&#xff1a;GitHub中upload-labs有多个版本:19关、21关、23关。版本不同&#xff0c;关卡的顺序也很可能不同。此次例子是21关。 项目地址&#xff1a;https://github.com/c0ny1/upload-labs 一、Pass-01 【js前端检测的绕过】 1. 打开Pass-01 访问&#xff1a;ip/uploa…...

HCIP复习拓扑练习(修改版)

拓扑&#xff1a; 实际&#xff1a; 需求&#xff1a; 需求分析 1.这意味着学校内部网络能够正常解析域名并进行互联网访问。 2. PC1和PC2处于同一个内网192.168.1.0/24&#xff0c;其中PC1有权限访问外部网段3.3.3.0/24&#xff0c;而PC2没有。这涉及ACL&#xff08;访问控制…...

Zabbix 7.2 + Grafana 中文全自动安装ISO镜像

简介 ​ 基于Zabbix 官方的Alma Linux 8 作为基础镜像。 镜像源都改为国内大学镜像站&#xff0c;自动联网安装ZabbixGrafana。 安装中文字体、Zabbix和Grafana也配置默认中文。 Zabbix 也指定中文字体&#xff0c;绘图无乱码。 配置时区为东八区&#xff0c;Zabbix配置We…...

使用 Python 将 PDF 转换为文本:打造一个简单高效的提取工具

在数字化时代&#xff0c;PDF 文件是我们日常生活中常见的文档格式。无论是学术论文、工作报告还是电子书&#xff0c;PDF 的广泛使用让提取其中文字内容成为一个常见需求。手动复制粘贴显然效率低下&#xff0c;而借助 Python&#xff0c;我们可以轻松实现自动化提取。本文将介…...

scoop退回软件版本的方法

title: scoop退回软件版本的方法 date: 2025-3-11 23:53:00 tags: 其他 前言 在软件更新后&#xff0c;如果出现了很影响使用体验的问题&#xff0c;那么可以把软件先退回以前的版本进行使用&#xff0c; 但是scoop本身并没有提供直接让软件回退版本的功能&#xff0c;因此…...

网络爬虫-2:正则化

1.正则化 一.正则化 1.转义字符 转义字符含义\s空白字符&#xff08;空格、制表符等&#xff09;\d数字字符&#xff08;0-9&#xff09;\w字母、数字或下划线.除换行符外的任意字符\n换行符\t制表符 import re result re.findall(r\s, Hello World\nPython) print(result)…...

emacs使用mongosh的方便工具发布

github项目地址: GitHub - csfreebird/emacs_mongosh: 在emacs中使用mongosh快速登录mongodb数据库 * 用途 在emacs中使用mongosh快速登录mongodb数据库&#xff0c; 操作方法: M-x mongosh, 输入数据库名称&#xff0c;然后就可以自动登录&#xff0c;前提是你已经配置好了…...

【Spring】详细剖析Spring程序

文章目录 一、Spring概述1. Spring简介1.1 OCP开闭原则1.2 依赖倒置原则DIP1.3 控制反转IoC 2. Spring8大模块 二、Spring的入门程序1. Spring官网2. 第一个Spring程序2.1 创建工程2.2 配置 pom.xml&#xff1a;2.3 定义bean&#xff1a;User . java2.4 配置文件 spring.xml2.5…...

《MySQL数据库从零搭建到高效管理|库的基本操作》

目录 一、数据库的操作 1.1 展示数据库 1.2 创建数据库 1.3 使用数据库 1.4 查看当前数据库 1.5 删除数据库 1.6 小结 二、常用数据类型 2.1 数值类型 2.2 字符串类型 2.3 日期类型 一、数据库的操作 打开MySQL命令行客户端&#xff0c;安装完MySQL后会有两个客户端…...

docker部署jenkins,安装使用一条龙教程

Jenkins k8s 实现CI/CD 一、简介 1. JenKins是什么? Jenkins是一个开源软件项目&#xff0c;是基于Java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;使软件项目可以进行持续集成。 2. 什么是CI / CD…...

图像识别技术与应用-YOLO

1 YOLO-V1 YOLO-V1它是经典的one-stage方法&#xff0c;You Only Look Once&#xff0c;名字就已经说明了一切&#xff01;把检测问题转化成回归问题&#xff0c;一个CNN就搞定了&#xff01;也可以对视频进行实时检测&#xff0c;应用领域非常广&#xff01; YOLO-V1诞生与2…...