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

Java 中各种锁的使用详解

Java 锁的使用详解

Java 提供了多种锁机制来处理并发编程中的同步问题。下面我将通过代码示例来展示各种锁的使用方法和特点。

锁的选择指南

以下是选择合适锁的指南:

在这里插入图片描述

基本锁类型演示

// 由于这是在 Node.js 环境中模拟 Java 锁的概念,我们将使用注释和伪代码来解释console.log("Java 锁的使用详解\n");console.log("1. synchronized 关键字 (内置锁)");
console.log(`
public class SynchronizedExample {private int count = 0;// 同步方法 - 锁定当前对象实例public synchronized void increment() {count++;}// 同步代码块 - 锁定指定对象public void incrementBlock() {synchronized(this) {count++;}}// 静态同步方法 - 锁定类对象public static synchronized void staticMethod() {// 操作静态资源}
}
`);console.log("\n2. ReentrantLock (可重入锁)");
console.log(`
import java.util.concurrent.locks.ReentrantLock;public class ReentrantLockExample {private final ReentrantLock lock = new ReentrantLock();private int count = 0;public void increment() {// 获取锁lock.lock();try {count++;} finally {// 在 finally 块中释放锁,确保锁一定会被释放lock.unlock();}}// 尝试获取锁,带超时public void incrementWithTimeout() {try {// 尝试在 1 秒内获取锁boolean acquired = lock.tryLock(1, TimeUnit.SECONDS);if (acquired) {try {count++;} finally {lock.unlock();}} else {// 获取锁失败的处理System.out.println("无法获取锁");}} catch (InterruptedException e) {Thread.currentThread().interrupt();}}
}
`);console.log("\n3. ReadWriteLock (读写锁)");
console.log(`
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;public class ReadWriteLockExample {private final ReadWriteLock rwLock = new ReentrantReadWriteLock();private int data = 0;// 读操作 - 可以多个线程同时读public int readData() {rwLock.readLock().lock();try {return data;} finally {rwLock.readLock().unlock();}}// 写操作 - 只能一个线程写,且写时不能读public void writeData(int newValue) {rwLock.writeLock().lock();try {data = newValue;} finally {rwLock.writeLock().unlock();}}
}
`);console.log("\n4. StampedLock (带版本号的锁)");
console.log(`
import java.util.concurrent.locks.StampedLock;public class StampedLockExample {private final StampedLock lock = new StampedLock();private double x, y;// 写操作 - 独占模式public void move(double deltaX, double deltaY) {long stamp = lock.writeLock();try {x += deltaX;y += deltaY;} finally {lock.unlockWrite(stamp);}}// 读操作 - 乐观读public double distanceFromOrigin() {// 乐观读,不阻塞写操作long stamp = lock.tryOptimisticRead();double currentX = x;double currentY = y;// 检查读取期间是否有写操作发生if (!lock.validate(stamp)) {// 有写操作,切换到悲观读锁stamp = lock.readLock();try {currentX = x;currentY = y;} finally {lock.unlockRead(stamp);}}return Math.sqrt(currentX * currentX + currentY * currentY);}// 悲观读锁public double distanceFromOriginPessimistic() {long stamp = lock.readLock();try {return Math.sqrt(x * x + y * y);} finally {lock.unlockRead(stamp);}}
}
`);console.log("\n5. Condition (条件变量)");
console.log(`
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;public class ConditionExample {private final ReentrantLock lock = new ReentrantLock();private final Condition notFull = lock.newCondition();private final Condition notEmpty = lock.newCondition();private final Object[] items = new Object[100];private int putIndex, takeIndex, count;// 生产者方法public void put(Object x) throws InterruptedException {lock.lock();try {// 缓冲区已满,等待while (count == items.length) {notFull.await();}items[putIndex] = x;putIndex = (putIndex + 1) % items.length;count++;// 通知消费者有新数据notEmpty.signal();} finally {lock.unlock();}}// 消费者方法public Object take() throws InterruptedException {lock.lock();try {// 缓冲区为空,等待while (count == 0) {notEmpty.await();}Object x = items[takeIndex];takeIndex = (takeIndex + 1) % items.length;count--;// 通知生产者有空间notFull.signal();return x;} finally {lock.unlock();}}
}
`);console.log("\n6. Semaphore (信号量)");
console.log(`
import java.util.concurrent.Semaphore;public class SemaphoreExample {// 创建一个只允许5个线程同时访问的信号量private final Semaphore semaphore = new Semaphore(5);public void accessResource() {try {// 获取许可semaphore.acquire();try {// 访问资源System.out.println("访问资源中...");Thread.sleep(1000); // 模拟资源访问} finally {// 释放许可semaphore.release();}} catch (InterruptedException e) {Thread.currentThread().interrupt();}}// 尝试获取许可,不阻塞public void tryAccessResource() {boolean acquired = semaphore.tryAcquire();if (acquired) {try {// 访问资源System.out.println("访问资源中...");} finally {semaphore.release();}} else {System.out.println("无法获取许可,资源繁忙");}}
}
`);console.log("\n7. CountDownLatch (倒计时门闩)");
console.log(`
import java.util.concurrent.CountDownLatch;public class CountDownLatchExample {public void execute() throws InterruptedException {// 创建一个初始计数为3的CountDownLatchfinal CountDownLatch latch = new CountDownLatch(3);// 启动三个工作线程for (int i = 0; i < 3; i++) {final int taskId = i;new Thread(() -> {try {// 模拟任务执行System.out.println("任务 " + taskId + " 执行中...");Thread.sleep(1000);System.out.println("任务 " + taskId + " 完成");// 计数减一latch.countDown();} catch (InterruptedException e) {Thread.currentThread().interrupt();}}).start();}// 主线程等待所有工作线程完成System.out.println("等待所有任务完成...");latch.await();System.out.println("所有任务已完成,继续执行主线程");}
}
`);console.log("\n8. CyclicBarrier (循环栅栏)");
console.log(`
import java.util.concurrent.CyclicBarrier;public class CyclicBarrierExample {public void execute() {// 创建一个CyclicBarrier,当3个线程到达栅栏时,执行指定的任务final CyclicBarrier barrier = new CyclicBarrier(3, () -> {System.out.println("所有线程都到达栅栏,执行栅栏动作");});// 启动三个工作线程for (int i = 0; i < 3; i++) {final int taskId = i;new Thread(() -> {try {System.out.println("线程 " + taskId + " 正在执行第一阶段");Thread.sleep(1000);// 第一个栅栏点System.out.println("线程 " + taskId + " 到达第一个栅栏");barrier.await();System.out.println("线程 " + taskId + " 正在执行第二阶段");Thread.sleep(1000);// 第二个栅栏点 (循环使用)System.out.println("线程 " + taskId + " 到达第二个栅栏");barrier.await();System.out.println("线程 " + taskId + " 完成所有工作");} catch (Exception e) {e.printStackTrace();}}).start();}}
}
`);console.log("\n9. Phaser (阶段器)");
console.log(`
import java.util.concurrent.Phaser;public class PhaserExample {public void execute() {// 创建一个初始参与者数量为1的Phaser (主线程)final Phaser phaser = new Phaser(1);// 创建并启动3个工作线程for (int i = 0; i < 3; i++) {final int taskId = i;// 注册一个参与者phaser.register();new Thread(() -> {try {System.out.println("线程 " + taskId + " 开始第一阶段");Thread.sleep(1000);// 到达第一阶段结束点,等待其他线程System.out.println("线程 " + taskId + " 完成第一阶段");phaser.arriveAndAwaitAdvance();System.out.println("线程 " + taskId + " 开始第二阶段");Thread.sleep(1000);// 到达第二阶段结束点,等待其他线程System.out.println("线程 " + taskId + " 完成第二阶段");phaser.arriveAndAwaitAdvance();System.out.println("线程 " + taskId + " 开始第三阶段");Thread.sleep(1000);// 完成所有阶段,取消注册System.out.println("线程 " + taskId + " 完成所有阶段");phaser.arriveAndDeregister();} catch (InterruptedException e) {Thread.currentThread().interrupt();}}).start();}// 主线程等待所有工作线程完成第一阶段phaser.arriveAndAwaitAdvance();System.out.println("所有线程完成第一阶段");// 主线程等待所有工作线程完成第二阶段phaser.arriveAndAwaitAdvance();System.out.println("所有线程完成第二阶段");// 主线程等待所有工作线程完成第三阶段phaser.arriveAndAwaitAdvance();System.out.println("所有线程完成所有阶段");// 主线程取消注册phaser.arriveAndDeregister();}
}
`);console.log("\n10. 锁的最佳实践");
console.log(`
1. 尽量缩小同步范围,只锁定必要的代码块
2. 避免在持有锁的情况下执行耗时操作
3. 避免死锁:- 按固定顺序获取多个锁- 使用带超时的锁获取方法- 使用 tryLock() 方法避免死锁
4. 优先使用并发集合而不是同步集合
5. 考虑使用无锁数据结构和原子变量
6. 适当选择锁类型:- 简单场景:synchronized- 需要高级特性:ReentrantLock- 读多写少:ReadWriteLock- 高并发读场景:StampedLock
`);

各种锁的特点比较

锁类型可重入公平性选择阻塞超时等待可中断适用场景
synchronized简单同步场景
ReentrantLock需要高级特性的场景
ReadWriteLock读多写少场景
StampedLock部分高性能读多写少场景
Semaphore资源数量控制
CountDownLatch等待多个线程完成
CyclicBarrier多个线程相互等待
Phaser分阶段任务协调

希望这些示例和说明能帮助您理解Java中各种锁的使用方法和适用场景。

相关文章:

Java 中各种锁的使用详解

Java 锁的使用详解 Java 提供了多种锁机制来处理并发编程中的同步问题。下面我将通过代码示例来展示各种锁的使用方法和特点。 锁的选择指南 以下是选择合适锁的指南&#xff1a; 基本锁类型演示 // 由于这是在 Node.js 环境中模拟 Java 锁的概念&#xff0c;我们将使用注释…...

【GreenHills】GHS解决客户端在连接的时候提示在黑名单

1、 文档目标 解决GHS网络版客户在客户端连接的时候出现黑名单的问题 2、 问题场景 用于解决GHS的网络版客户在搭建完服务端后&#xff0c;客户端去连接服务的时候出现提示“在黑名单中”等情况&#xff08;如图2-1和图2-2&#xff09;。但是在服务器上面并没有设置黑名单。 …...

智能运维时代的网络拓扑管理:乐维监控的架构可视化实践

在数字化转型的浪潮中&#xff0c;企业IT基础设施正经历着前所未有的复杂化进程。当数以千计的网络设备、服务器、存储系统构成庞大网络体系时&#xff0c;如何实现全局可视化管理已成为企业数字化转型的关键命题。乐维监控网络拓扑系统作为新一代智能运维平台的核心组件&#…...

GitHub美化个人主页3D图表显示配置操作

这个功能主要是用的这个开源仓库&#xff1a;https://github.com/yoshi389111/github-profile-3d-contrib 想看效果的话&#xff0c;我的个人主页&#xff1a;https://github.com/Sjj1024 开始操作 1.创建自己的github主页属性项目——跟你github用户名一致即可&#xff0c;…...

Arduino示例代码讲解:Serial Event example 连续事件例子

Arduino示例代码讲解:Serial Event example 连续事件例子 Serial Event example 连续事件例子功能概述硬件部分:软件部分:代码逐行解释定义变量`setup()` 函数`loop()` 函数`serialEvent()` 函数工作原理Serial Event example 连续事件例子 这段代码是一个Arduino示例程序,…...

Java基础关键_031_反射(一)

目 录 一、概述 二、获取 Class 的三种方式 1.Class.forName("完整全限定类名") 2.getClass() 3.class 属性 三、通过反射机制实例化对象 1.newInstance()&#xff08;已过时&#xff09; 2.配置文件利用反射机制实例化对象 四、反射 Class 的 Field 1.获取 P…...

verilog/systemverilog中的位序问题

verilog或者systemverilog中在使用位选择时&#xff0c;必须按照定义的大小端顺序进行位选操作&#xff0c;比如定义了reg [11:0] data&#xff0c;在使用data的中间4位时&#xff0c;必须使用data[7:4]&#xff0c;不能使用data[4:7]。 如下示例&#xff1a; module tb;reg […...

JVM考古现场(十三):混沌重启——从量子永生到宇宙热寂的终极编译

开篇&#xff1a;鸿蒙初判熵火燎原"诸君可曾窥见《诛仙剑阵》终章里那冻结的量子递归&#xff1f;当Project Omega的热寂算法冰封时空熵增&#xff0c;当意识编译器的玻尔兹曼大脑撕裂熵障&#xff0c;此刻我们将踏碎归墟晶壁&#xff0c;在第十三维度叩问&#xff1a;从代…...

CARLA常见技术问题集锦(一)地图与场景构建篇

编者荐语&#xff1a; 在自动驾驶技术加速落地的今天&#xff0c;CARLA 仿真引擎凭借其开源生态与高保真仿真能力&#xff0c;已成为全球开发者构建智能驾驶算法的核心工具之一。随着虚幻引擎 5.5 的全面升级&#xff0c;CARLA 0.10.0 版本实现了视觉革命&#xff1a;Lumen 全…...

视图、MySQL、触发器、存储过程、流程控制语句

DAY19.1 Java核心基础 MySQL 视图 数据库中的一张虚拟的表&#xff0c;允许不同用户和不同程序以不同的方式查询同一张表的数据 基于数据表&#xff0c;创建一个虚拟的表&#xff0c;然后可以选择需要展示的字段 为不同的用户创建不同的视图&#xff0c;一个视图包含薪资&…...

多层感知机(MLP)全面指南

多层感知机(MLP) 是一种人工神经网络,由多个神经元层组成。MLP中的神经元通常使用非线性激活函数,使得网络能够学习数据中的复杂模式。MLP 在机器学习中非常重要,因为它能够学习数据中的非线性关系,使其成为分类、回归和模式识别等任务中的强大模型。 神经网络基础 神经…...

【第13届蓝桥杯C/C++B组省赛】顺子日期

答案&#xff1a;14 1.数组办法解决 思路&#xff1a;前四个元素已经确定&#xff0c;分别枚举其他元素的合法性 #include <stdio.h> int main() {int a[8] {2,0,2,0,0,0,0,0};int month[13]{0,31,28,31,30,31,30,31,31,30,31,30,31};int i,j;int count 0;for(i 1;…...

智慧医疗胃癌检测数据集VOC+YOLO格式487张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;487 标注数量(xml文件个数)&#xff1a;487 标注数量(txt文件个数)&#xff1a;487 标注…...

每日一题-力扣-2716: 最小化字符串长度 0328

LeetCode 2716: 最小化字符串长度问题剖析 题目解读 LeetCode 2716 是一道关于字符串操作的算法题。这道题乍看复杂&#xff0c;实则蕴含着优雅的数学规律。题目要求通过一系列特定的删除操作来最小化字符串的长度&#xff1a; 给定一个下标从 0 开始的字符串 s每次操作可以选…...

量子计算:开启未来计算的新纪元

一、引言 在当今数字化时代&#xff0c;计算技术的飞速发展深刻地改变了我们的生活和工作方式。从传统的电子计算机到如今的高性能超级计算机&#xff0c;人类在计算能力上取得了巨大的进步。然而&#xff0c;随着科技的不断推进&#xff0c;我们面临着越来越多的复杂问题&…...

安卓车载app面经

java部分 常见集合类 List 继承了Collection接口的一个接口&#xff0c;List中的数据是有序的&#xff0c;可重复的 实现类 在Java中&#xff0c;List 是一个接口&#xff0c;它属于 Java Collections Framework 的一部分。List 接口代表了一个有序的集合&#xff08;有时…...

JAVA SE :认识数组

目录 1.概念 2.数组的创建和初始化 2.1 创建 2.2 初始化 3.数组的使用 4.认识引用数据类型 4.1 JVM的内存分布 4.2 基本数据类型和引用数据类型 4.3 null的认识 5.二维数组 6.Arrays类的了解和使用 1.概念 数组用于存储一定数量相同类型的数据&#xff0c;可以看…...

深入理解机器学习之TF-IDF:文本特征提取的核心技术

文章目录 引言一、什么是TF-IDF&#xff1f;二、TF-IDF的数学原理1. 词频(TF)计算2. 逆文档频率(IDF)计算3. TF-IDF计算 三、TF-IDF的Python实现1.数据文件介绍2.导入库3.读取数据4.数据预处理5.对单词进行排序6.全部代码 四、结语 引言 在自然语言处理(NLP)和文本挖掘领域&am…...

Anaconda Jupyter 默认启动位置修改

Anaconda Jupyter 默认启动位置修改 本篇给大家分享的事关于Anaconda Jupyter的保存路径修改方法。 我们使用Anaconda Jupyter默认启动时&#xff0c;通常会跳转进入C盘的用户目录下&#xff0c;如下图所示。 但是很多时候我们使用 Jupyter 的场景并不在C盘&#xff0c;因为它…...

CNG汽车加气站操作工备考真题及答案解析【判断题】

1、燃气经营许可证按照燃气经营规模和类别实行分级审批。&#xff08;√&#xff09; 解析&#xff1a;不同规模和类别的燃气经营&#xff0c;其许可证审批级别不同&#xff0c;以确保经营活动的规范和安全。 2、依照《安全生产法》的规定&#xff0c;安全生产监督检查人员对检…...

es 3期 第27节-运用Script脚本实现复杂需求

#### 1.Elasticsearch是数据库&#xff0c;不是普通的Java应用程序&#xff0c;传统数据库需要的硬件资源同样需要&#xff0c;提升性能最有效的就是升级硬件。 #### 2.Elasticsearch是文档型数据库&#xff0c;不是关系型数据库&#xff0c;不具备严格的ACID事务特性&#xff…...

智能监控视频聚合平台,GB28181/RTSP/SIP/RTMP直播会议融合方案

全场景智能监控聚合平台&#xff1a;打破边界&#xff0c;赋能高效协同 在数字化转型加速的今天&#xff0c;海量视频监控设备、多样化的编码协议与复杂的业务场景&#xff0c;让企业面临跨系统整合难、资源调度效率低、协作响应慢等痛点。我们的智能监控聚合平台以技术创新为…...

B494:开关电源领域的PWM控制新星

在电子技术飞速发展的今天&#xff0c;高效的电源管理系统成为各类电子设备稳定运行的关键。B494电压驱动型脉宽调制&#xff08;PWM&#xff09;控制集成电路以其卓越的性能和丰富的功能&#xff0c;成为开关电源设计领域的焦点。 一、B494&#xff1a;开关电源领域的PWM控制…...

03 相机标定图像采集

学完本文,您将获取一下技能: 1:如何提升标定质量,如选择标定板,标定图像采集的注意事项, 2:实现标定图像自动筛选的代码 3:量产场景如何通过一张图像来标定相机 为了实现良好的标定效果,以下因素在标定数据采集前必须设置得当。 标定板选择 标定板尺寸准确材料平…...

详解Spark executor

在 Apache Spark 中&#xff0c;Executor&#xff08;执行器&#xff09; 是运行在集群工作节点&#xff08;Worker Node&#xff09;上的进程&#xff0c;负责执行具体的计算任务并管理数据。它是 Spark 分布式计算的核心组件之一&#xff0c;直接决定了任务的并行度和资源利用…...

约束文件SDC常用命令

约束文件SDC常用命令 定义时钟create_clock -name CLK-period 2 [get_ports_clk]告诉工具主时钟周期是2ns(频率500MHz),从clk端口输入 输入信号延迟set_input_delay 0.5 -clock CLK [get_ports data_in]数据进芯片前,外部电路已消耗0.5ns,综合要预留这段“堵车时间”。 输出…...

流量分析2

一&#xff0c;webshell流量 [GKCTF 2021]签到 先看协议分级&#xff0c;大部分是tcp&#xff0c;里面有http的基于的行文本数据占了很大的比重&#xff0c;看看里面有什么 过滤http的流量 点击一条流量&#xff0c;里面的内容进去后面有基于行的文本数据&#xff0c; 先解he…...

23种设计模式-组合(Composite)设计模式

组合设计模式 &#x1f6a9;什么是组合设计模式&#xff1f;&#x1f6a9;组合设计模式的特点&#x1f6a9;组合设计模式的结构&#x1f6a9;组合设计模式的优缺点&#x1f6a9;组合设计模式的Java实现&#x1f6a9;代码总结&#x1f6a9;总结 &#x1f6a9;什么是组合设计模式…...

数据库概述

文章目录 数据库1、什么是数据库&#xff1f;2、数据库的分类关系型数据库非关系型数据库优缺点 3、MySQL数据库的安装和使用3.1 卸载3.2 安装命令行操作 4、 Navicat For MySQL连接MySQL新建数据库新建表在表中添加数据执行SQL语句 数据库 1、什么是数据库&#xff1f; 数据…...

C# System.Text.Encoding 使用详解

总目录 前言 在C#编程中&#xff0c;处理字符串和字节数组之间的转换是一个常见的任务。System.Text.Encoding类及其派生类提供了丰富的功能&#xff0c;帮助开发者实现不同字符编码之间的转换。本文将详细讲解System.Text.Encoding类的使用方法&#xff0c;包括常用编码的介绍…...

js 对象深拷贝的五种方法

js 对象深拷贝 今天遇到一个bug &#xff0c;子组件页面修改了内容&#xff0c;但是按了取消保存按钮&#xff0c;没有将数据传回父组件的&#xff0c;但是父组件的数据改了&#xff0c;原因是通过子组件接受父组件的参数对象层级深没有做深拷贝的原因。 在 JavaScript 中&…...

1.1 计算机网络的概念

首先来看什么是计算机网络&#xff0c;关于计算机网络的定义并没有一个统一的标准&#xff0c;不同的教材有 不同的说法&#xff08;这是王道书对于计算机网络的定义&#xff09;&#xff0c;我们可以结合自己的生活经验去体会这个 定义。 可以用不同类型的设备去连接计算机网络…...

当EFISH-SBC-RK3576遇上区块链:物联网安全与可信数据网络‌

在工业物联网场景中&#xff0c;设备身份伪造与数据篡改是核心安全隐患。‌EFISH-SBC-RK3576‌ 通过 ‌硬件安全模块 区块链链上验证‌&#xff0c;实现设备身份可信锚定与数据全生命周期加密&#xff0c;安全性能提升10倍以上。 1. 安全架构&#xff1a;从芯片到链的端到端防…...

k8s 基础知识:Service + 负载均衡(下)

但凡觉得哪块说有问题&#xff0c;欢迎评论区留言探讨&#xff0c;谢谢 K8s Service 是 Kubernetes 集群中用于暴露应用程序的一种资源对象&#xff1a; 一、概念与作用&#xff1a; Service 可以将一组具有相同功能的 Pod&#xff08;容器组&#xff09;定义为一个逻辑分组…...

deepseek(2)——deepseek 关键技术

1 Multi-Head Latent Attention (MLA) MLA的核心在于通过低秩联合压缩来减少注意力键&#xff08;keys&#xff09;和值&#xff08;values&#xff09;在推理过程中的缓存&#xff0c;从而提高推理效率&#xff1a; c t K V W D K V h t c_t^{KV} W^{DKV}h_t ctKV​WDKVht​…...

机器学习之条件概率

1. 引言 概率模型在机器学习中广泛应用于数据分析、模式识别和推理任务。本文将调研几种重要的概率模型,包括EM算法、MCMC、朴素贝叶斯、贝叶斯网络、概率图模型(CRF、HMM)以及最大熵模型,介绍其基本原理、算法流程、应用场景及优势。 2. EM算法(Expectation-Maximizati…...

第四天 文件操作(文本/CSV/JSON) - 异常处理机制 - 练习:日志文件分析器

Python文件操作与异常处理完全指南&#xff1a;从入门到实战 一、为什么要学习文件操作和异常处理&#xff1f; 在Python编程的初级阶段&#xff0c;我们主要处理内存中的数据。但当我们需要&#xff1a; 永久保存数据处理各种格式的数据文件分析系统日志构建数据处理管道 …...

多onnx模型导出合并调研(文本检测+方向分类+文本识别)

👑主页:吾名招财 👓简介:工科学硕,研究方向机器视觉,爱好较广泛… ​💫签名:面朝大海,春暖花开! 多onnx模型合并导出调研(文本检测+方向分类+文本识别) 引言1,尝试合并两个模型(文本方向分类+文本识别模型)(并行合并)(1)文本方向分类(2)文本识别模型(…...

linux scp复制多层级文件夹到另一服务器免密及脚本配置

文章目录 生成 SSH 密钥对将公钥复制到目标服务器验证免密登录scp 多级文件夹复制脚本 生成 SSH 密钥对 在本地机器上&#xff0c;使用 ssh-keygen 命令生成 SSH 密钥对。打开终端并执行以下命令&#xff1a; ssh-keygen -t rsa 按提示连续按回车键&#xff0c;默认会在 ~/.ss…...

Ubuntu 22.04 安装向日葵远程控制

1. 前言 由于公司客户的服务器用是图形化桌面&#xff0c;所以我们需要一个远程控制工具来控制服务器&#xff0c;目前市面上两款比较热门的控制软件就是ToDesk和向日葵了&#xff0c;我们今天就来学习一下向日葵的使用 2. 下载软件 前往向日葵官网下载 向日葵远程控制app官…...

Spring Boot(十七):集成和使用Redis

Redis(Remote Dictionary Server,远程字典服务器)是一个开源的、基于内存的数据结构存储系统,它可以用作数据库、缓存和消息中间件。Spring Boot 中集成和使用Redis主要涉及以下几个步骤: 添加依赖 在项目的pom.xml文件中添加Redis的依赖。Spring Boot提供了对Redis的集…...

Redisson - 分布式锁和同步器

文章目录 锁&#xff08;Lock&#xff09;公平锁&#xff08;Fair Lock&#xff09;联锁&#xff08;MultiLock&#xff09;红锁&#xff08;RedLock&#xff09; 【已废弃】读写锁&#xff08;ReadWriteLock&#xff09;信号量&#xff08;Semaphore&#xff09;可过期许可信号…...

LabVIEW时间触发协议

介绍了基于LabVIEW开发的时间触发协议应用&#xff0c;通过实例解析了FlexRay总线的设计与优化。通过技术细节、系统构建和功能实现等方面&#xff0c;探讨了LabVIEW在现代工业通信系统中的应用效能&#xff0c;特别是在提高通信可靠性和实时性方面的贡献。 ​ 项目背景 在工…...

IDEA的使用

idea的介绍 IntelliJ IDEA 是由 JetBrains 公司开发的一款功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;主要用于Java语言的开发&#xff0c;但同时也支持其他多种编程语言如Kotlin、Groovy、Scala等。它被广泛认为是专业软件开发者的首选工具之一&#xff…...

unity一个图片的物体,会有透明的效果

如图 想要去掉这个透明效果 选择一个高层级的layer即可。...

IP报文格式

IPv4 头部结构&#xff08;共 20 字节&#xff0c;不含可选字段&#xff09; 1. 版本&#xff08;Version&#xff09; 长度&#xff1a;4 比特 作用&#xff1a;标识 IP 协议版本&#xff08;IPv4 值为 4&#xff0c;IPv6 值为 6&#xff09;。 示例&#xff1a;0100&#x…...

2025最新-智慧小区物业管理系统

目录 1. 项目概述 2. 技术栈 3. 功能模块 3.1 管理员端 3.1.1 核心业务处理模块 3.1.2 基础信息模块 3.1.3 数据统计分析模块 3.2 业主端 5. 系统架构 5.1 前端架构 5.2 后端架构 5.3 数据交互流程 6. 部署说明 6.1 环境要求 6.2 部署步骤 7. 使用说明 7.1 管…...

sql结尾加刷题

找了一下mysql对extractvalue()、updatexml()函数的官方介绍https://dev.mysql.com/doc/refman/5.7/en/xml-functions.html#function_extractvalue ExtractValue(xml_frag, xpath_expr) 知识点 解释一下这两个参数xml_frag&#xff0c;是xml标记片段&#xff0c;第二个参数…...

UE4学习笔记 FPS游戏制作26 UE中的UI

文章目录 几个概念创建一个UI蓝图添加UI获取UI的引用 切换设计器和UI蓝图将UI添加到游戏场景锚点轴点slotSizeToContent三种UI数据更新方式函数绑定属性绑定事件绑定 九宫格分割图片 几个概念 UMG&#xff1a;UE的UI编辑器 slate UI: UE的UI的编辑语言 创建一个UI蓝图 右键用…...

pnpm 依赖升级终极指南:从语义化版本控制到 Monorepo 全局更新的企业级实践

要使用 pnpm 更新所有依赖包&#xff0c;可以通过以下命令实现&#xff1a; 1. 更新所有依赖到符合语义化版本的范围 pnpm update该命令会根据 package.json 中定义的版本范围&#xff08;如 ^1.0.0 或 ~2.3.4&#xff09;更新依赖包到最新兼容版本&#xff0c;但不会突破版本…...