Java大师成长计划之第10天:锁与原子操作
📢 友情提示:
本文由银河易创AI(https://ai.eaigx.com)平台gpt-4o-mini模型辅助创作完成,旨在提供灵感参考与技术分享,文中关键数据、代码与结论建议通过官方渠道验证。
在多线程编程中,锁与原子操作是保证线程安全、维护数据一致性的重要工具。在第10天的学习中,我们将深入探讨Java中的锁机制,特别是synchronized
关键字及java.util.concurrent
包中的一系列并发工具。理解这些工具和技术是成为Java并发编程大师的重要一步。
一、synchronized关键字
synchronized
是Java中用于实现线程安全的一个关键字。它是Java内置的同步机制,能够帮助开发者避免由于多线程并发执行导致的数据不一致和线程安全问题。本文将深入探讨synchronized
关键字的特性、使用方法以及在多线程环境中的应用。
1.1 synchronized的基本概念
在多线程编程中,多个线程可能同时访问共享资源(如类的静态变量、实例变量或其他对象),如果没有适当的同步机制,就可能导致数据不一致或竞态条件。synchronized
提供了一种简单而有效的方式来控制对共享资源的访问。
1.1.1 线程安全
线程安全是指在多线程环境中,代码的执行顺序和结果不受线程执行顺序影响的性质。使用synchronized
关键字,能够确保同一时刻只有一个线程可以执行被标记为synchronized
的代码块或方法,从而实现线程安全。
1.2 使用synchronized的方式
synchronized
关键字可以用于方法和代码块之上,具体可以分为以下两种使用方式:
1.2.1 方法级别的synchronized
在方法头部使用synchronized
关键字,可以确保在调用此方法时,其他线程不能同时访问该方法。synchronized
可以用于实例方法和静态方法。
实例方法锁
当一个实例方法被synchronized
修饰时,它锁定的是当前对象的实例。这意味着同一个对象的所有synchronized
实例方法在任意时刻只能有一个线程执行:
public synchronized void increment() {this.count++;
}
静态方法锁
当synchronized
用于静态方法时,它锁定的是类的Class
对象,而不是某个具体的实例。这样同一个类的所有synchronized
静态方法也会遵循相同的锁定规则:
public static synchronized void staticIncrement() {// 静态变量操作staticCount++;
}
1.2.2 代码块级别的synchronized
除了方法级别的锁定,synchronized
也可以用于代码块,它允许开发者更精确地控制锁的范围。一段代码块可以被synchronized
修饰,只需指定一个锁对象。
public void increment() {synchronized (this) { // 锁定当前实例this.count++;}
}
在上面的示例中,只有获取了当前对象的锁的线程才能执行代码块中的操作,减少了锁的持有时间,提高了程序的性能。
1.2.3 自定义锁对象
使用synchronized
时,开发者可以指定任何对象作为锁对象。这种方式可以更加灵活,特别是在需要对特定资源施加锁定时:
private final Object lock = new Object();public void increment() {synchronized (lock) { // 锁定自定义对象this.count++;}
}
1.3 锁的可重入性
在Java中,synchronized
是可重入的。这意味着同一个线程可以多次获取同一个锁,而不会导致死锁。例如:
public synchronized void methodA() {methodB(); // 线程可以再次获取同一个对象的锁
}public synchronized void methodB() {// ...
}
在上面的例子中,线程在调用methodA
时获得锁,接着在methodA
内部又调用了methodB
,该线程依然能够顺利获得锁并执行。
1.4 锁的公平性
synchronized
关键字不支持公平性。也就是说,线程对于获取锁的顺序是无序的,某个线程可能在其他线程之后获取锁,这种情况被称作“锁饥饿”。为了避免这种情况,可以考虑使用java.util.concurrent
包中的锁机制,如ReentrantLock
,它可以指定公平性策略,确保线程按照请求锁的顺序进行获取。
1.5 使用synchronized的注意事项
1.5.1 易产生死锁
在不恰当的使用情况下,synchronized
可能导致死锁。例如,两个线程分别持有两个不同的锁,并在等待对方释放锁:
public void lockA() {synchronized (lockA) {// 省略其他代码...lockB(); // 试图获取lockB的锁}
}public void lockB() {synchronized (lockB) {// 省略其他代码...lockA(); // 试图获取lockA的锁}
}
为了避免死锁,开发者应尽量规避嵌套锁,并保证所有锁的请求顺序一致。
1.5.2 性能开销
由于synchronized
会导致上下文切换和线程阻塞,因此它相对较低效。在高并发场景下,不必要的锁竞争会增加系统开销。务必合理使用synchronized
,尽量缩小锁的范围或使用其他并发工具。
1.6 小结
synchronized
关键字是Java多线程编程中不可或缺的工具,它提供了基本的同步机制以确保线程安全。理解它的使用方式和特点,对于开发安全和高效的多线程应用程序至关重要。通过合理使用synchronized
,开发者可以有效地管理并发问题,提高程序的稳定性与性能。然而,在复杂的应用场景下,开发者有时需要借助更灵活的并发工具(如ReentrantLock、CountDownLatch等)来补充synchronized
的不足。掌握这些同步机制,将为成为Java大师奠定基础。
二、java.util.concurrent包中的锁与并发工具
在Java中,java.util.concurrent
包提供了一系列强大的并发工具和锁机制,极大地增强了多线程编程的灵活性和效率。相比于传统的synchronized
关键字,这些工具不仅支持更复杂的并发控制,还提供了更好的性能和更多的功能。本文将深入探讨 java.util.concurrent
包中的几种主要锁和并发工具。
2.1 ReentrantLock类
ReentrantLock
是java.util.concurrent
包中最常用的显式锁。它是可重入的,即同一个线程可以多次获取同一个锁。与synchronized
相比,ReentrantLock
提供了更多的功能和灵活性。
2.1.1 创建和使用
以下是ReentrantLock
的基本用法:
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;public class Counter {private int count = 0;private final Lock lock = new ReentrantLock();public void increment() {lock.lock(); // 获取锁try {count++;} finally {lock.unlock(); // 确保释放锁}}public int getCount() {return count;}
}
在上述代码中,lock.lock()
方法用于获取锁,lock.unlock()
方法则确保在操作完成后释放锁,即使发生异常也能保证锁的释放,这样避免了由于未释放锁而导致的死锁风险。
2.1.2 公平锁与非公平锁
ReentrantLock
允许在创建时指定是否为公平锁。如果设置为公平锁,线程将按照请求锁的顺序获取锁,这样可以有效避免“线程饥饿”的情况。创建公平锁的示例:
Lock fairLock = new ReentrantLock(true); // 创建公平锁
默认情况下,ReentrantLock
是非公平的,它允许线程在竞争锁时优先获得锁,即使其他线程已经在等待。
2.1.3 尝试锁定
ReentrantLock
还有一个重要特点是提供了尝试获取锁的方法。这使得线程在无法获取锁时可以选择继续执行其他操作。例如:
if (lock.tryLock()) {try {// 执行需要锁定的任务} finally {lock.unlock();}
} else {// 锁不可用时的处理逻辑
}
采用tryLock()
方法设计代码,可以减少线程的阻塞,提高系统的响应能力。
2.2 ReadWriteLock
ReadWriteLock
是另一种重要的锁机制,可以提高读多写少的场景中的并发性能。它允许多个线程同时读取共享数据,而写操作则是独占的,即同一时间只能有一个线程进行写入操作。
2.2.1 使用ReadWriteLock
ReadWriteLock
通过ReentrantReadWriteLock
类实现,获取读锁和写锁的方式如下:
import java.util.concurrent.locks.ReentrantReadWriteLock;public class Data {private final ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();private int data;public int readData() {rwLock.readLock().lock();try {return data; // 读取操作} finally {rwLock.readLock().unlock(); // 确保释放读锁}}public void writeData(int newData) {rwLock.writeLock().lock();try {data = newData; // 写入操作} finally {rwLock.writeLock().unlock(); // 确保释放写锁}}
}
在这个例子中,多个线程可以并行读取数据,但在写入数据时,必须获取写锁,这保证了数据的完整性和一致性。
2.3 Condition接口
Condition
接口是以Lock
为基础的,用于实现线程间的协调和通知机制。它提供了await()
和signal()
等方法,允许线程在某些条件下等待和被唤醒。
2.3.1 结合Lock使用
首先,通过Lock
创建Condition
实例:
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
接着,线程可以在某个条件上等待:
lock.lock();
try {while (!conditionMet) {condition.await(); // 等待条件}// 处理逻辑
} finally {lock.unlock();
}
其他线程可以通知条件已经发生变化:
lock.lock();
try {// 更新条件condition.signal(); // 唤醒其他等待线程
} finally {lock.unlock();
}
通过结合Lock
和Condition
,开发者能够更灵活地设计复杂的线程协作机制。
2.4 并发集合
java.util.concurrent
包还提供了一系列强大的并发集合类,如ConcurrentHashMap
、CopyOnWriteArrayList
、BlockingQueue
等,从而使得数据结构在线程安全方面更加灵活、简便。
2.4.1 ConcurrentHashMap
ConcurrentHashMap
是线程安全的哈希表,允许多个线程并发地读取和写入。与HashTable
不同,它通过分段锁的机制实现高效的并发操作,大大提高性能。
import java.util.concurrent.ConcurrentHashMap;ConcurrentHashMap<String, String> map = new ConcurrentHashMap<>();
map.put("key1", "value1");
String value = map.get("key1");
2.4.2 CopyOnWriteArrayList
CopyOnWriteArrayList
是一个线程安全的变种列表,它的特点是对读取操作的支持非常优化。它适用于读操作远多于写操作的场景,因为每次写操作都会复制底层数组。
import java.util.concurrent.CopyOnWriteArrayList;CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
list.add("item1");
String value = list.get(0);
2.4.3 BlockingQueue
BlockingQueue
是一种支持阻塞操作的队列,适用于生产者-消费者模型。它提供了多种操作,如添加、获取、查看队列头元素等,且支持阻塞和超时功能:
import java.util.concurrent.ArrayBlockingQueue;ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<>(10);
queue.put("item1"); // 阻塞直到空间可用
String value = queue.take(); // 阻塞直到有元素可用
2.5 Atomic变量
除了锁和线程安全集合外,java.util.concurrent
包还提供了一系列原子类(如AtomicInteger
、AtomicBoolean
等),用于简化基本类型的线程安全操作。这些类内部使用CAS(Compare-And-Swap)机制可以实现高效的线程安全操作。
2.5.1 使用Atomic变量
import java.util.concurrent.atomic.AtomicInteger;AtomicInteger atomicCount = new AtomicInteger(0);
int count = atomicCount.incrementAndGet(); // 原子性地增加计数
通过使用原子类,开发者可以避免使用显式锁,提高性能,尤其在高并发场景下。
2.6 小结
java.util.concurrent
包为Java开发者提供了丰富的并发工具和锁机制,使得多线程编程变得更加灵活和高效。从ReentrantLock
到BlockingQueue
再到原子变量,开发者可以针对不同的并发场景选择合适的工具,以提高程序性能和维护性。理解这些工具的使用方法和适用场景,将极大地增强你的并发编程能力。在现代Java应用程序中,熟练掌握这些工具是成为高效开发者的重要一步。
三、小结
在本篇博文中,我们深入探讨了Java多线程编程中锁与原子操作的重要性。熟练掌握synchronized
关键字、java.util.concurrent
包中的工具以及原子类的使用对于编写健壮、高效的并发代码至关重要。虽然synchronized
关键字提供了基本的锁机制,但在处理复杂并发场景时,ReentrantLock
、ReadWriteLock
和原子类提供的灵活性和高效性将显著提升程序的性能和可靠性。
在接下来的学习中,建议在实践中不断探索,并结合具体场景选择合适的并发工具,使我们在多线程编程领域更加得心应手,迈向Java大师的目标。
相关文章:
Java大师成长计划之第10天:锁与原子操作
📢 友情提示: 本文由银河易创AI(https://ai.eaigx.com)平台gpt-4o-mini模型辅助创作完成,旨在提供灵感参考与技术分享,文中关键数据、代码与结论建议通过官方渠道验证。 在多线程编程中,锁与原子…...
2025大模型安全研究十大框架合集(10份)
2025大模型安全研究十大框架合集的详细介绍: Anthropic AI信任研究框架 Anthropic于2024年10月更新的《安全责任扩展政策》(RSP),提出了一个灵活的动态AI风险治理框架。该框架规定当AI模型达到特定能力时,将自动升级安全措施,如…...
溯因推理思维——AI与思维模型【92】
一、定义 溯因推理思维模型是一种从结果出发,通过分析、推测和验证,寻找导致该结果的可能原因的思维方式。它试图在已知的现象或结果基础上,逆向追溯可能的原因,构建合理的解释框架,以理解事物的本质和内在机制。 二、由来 溯因推理的思想可以追溯到古希腊哲学家亚里士…...
系统架构设计师:设计模式——结构型设计模式
一、结构型设计模式 结构型设计模式涉及如何组合类和对象以获得更大的结构。结构型类模式采用继承机制来组合接口或实现。一个简单的例子是采用多重继承方法将两个以上的类组合成一个类,结果这个类包含了所有父类的性质。 这一模式尤其有助于多个独立开发的类库协…...
接口测试实战指南:从入门到精通的质量保障之道
为什么接口测试如此重要? 在当今快速迭代的软件开发环境中,接口测试已成为质量保障体系中不可或缺的一环。据统计,有效的接口测试可以发现约70%的系统缺陷,同时能将测试效率提升3-5倍。本指南将从实战角度出发,系统性…...
对第三方软件开展安全测评,如何保障其安全使用?
对第三方软件开展安全测评,能够精准找出软件存在的各类安全隐患,进而为软件的安全使用给予保障。此次会从漏洞发现、风险评估、测试环境等多个方面进行具体说明。 漏洞发现情况 在测评过程中,我们借助专业技术与工具,对第三方软…...
计算方法实验四 解线性方程组的间接方法
【实验性质】 综合性实验。 【实验目的】 掌握迭代法求解线性方程组。 【实验内容】 应用雅可比迭代法和Gauss-Sediel迭代法求解下方程组: 【理论基础】 线性方程组的数值解法分直接算法和迭代算法。迭代法将方程组的求解转化为构造一个向量序列&…...
Qt 中基于 QTableView + QSqlTableModel 的分页搜索与数据管理实现
Qt 中基于 QTableView QSqlTableModel 的分页搜索与数据管理实现 一、组件说明 QTableView:一个基于模型的表格视图控件,支持排序、选择、委托自定义。QSqlTableModel:与数据库表直接绑定的模型类,可用于展示和编辑数据库表数据…...
云计算-容器云-服务网格Bookinfo
服务网格:创建 Ingress Gateway 将 Bookinfo 应用部署到 default 命名空间下,请为 Bookinfo 应用创建一个网 关,使外部可以访问 Bookinfo 应用。 上传ServiceMesh.tar.gz包 [rootk8s-master-node1 ~]# tar -zxvf ServiceMesh.tar.gz [rootk…...
PostgreSQL自定义函数
自定义函数 基本语法 //建一个名字为function_name的自定义函数create or replace function function_name() returns data_type as //returns 返回一个data_type数据类型的结果;data_type 是返回的字段的类型;$$ //固定写法......//方法体$$ LANGUAGE …...
学习记录:DAY22
我的重生开发之旅:优化DI容器,git提交规范,AOP处理器,锁与并发安全 前言 我重生了,重生到了五一开始的一天。上一世,我天天摆烂,最后惨遭实习生优化。这一世,我要好好内卷… 今天的…...
HarmonyOS NEXT第一课——HarmonyOS介绍
一、什么是HarmonyOS 万物互联时代应用开发的机遇、挑战和趋势 随着万物互联时代的开启,应用的设备底座将从几十亿手机扩展到数百亿IoT设备。全新的全场景设备体验,正深入改变消费者的使用习惯。 同时应用开发者也面临设备底座从手机单设备到全场景多设…...
数据库系统概论|第五章:数据库完整性—课程笔记1
前言 在前文介绍完数据库标准语言SQL之后,大家已经基本上掌握了关于数据库编程的基本操作,那我们今天将顺承介绍关于数据库完整性的介绍,数据库的完整性是指数据的正确性和相容性。数据的完整性是为了防止数据库中存在不符合语义的数据&…...
开源无人机地面站QGroundControl安卓界面美化与逻辑优化实战
QGroundControl作为开源无人机地面站软件,其安卓客户端界面美化与逻辑优化是提升用户体验的重要工程。 通过Qt框架的界面重构和代码逻辑优化,可以实现视觉升级与性能提升的双重目标。本文将系统讲解QGC安卓客户端的二次开发全流程,包括开发环境搭建、界面视觉升级、多分辨率…...
工作记录 2017-12-12 + 在IIS下发布wordpress
工作记录 2017-12-12 序号 工作 相关人员 1 修改邮件上的问题。 更新RD服务器。 在IIS下发布wordpress。 郝 服务器更新 RD服务器更新了,更新的文件放在190的D:\Temp\CHTeam\fnehr_update_20171212\下了。 数据库更新: 数据库没有更新 更新的文件…...
BBR 之 ProbeRTT 新改
早在 1981 年,Jaffe 在 Flow Control Power is Nondecentralizable 中就给出过论证,测量 maxbw 必然引入队列,而获得 minrtt 时带宽必然欠载,这确定了后面 30 年的拥塞控制算法基调,但 BBR 在 35 年后非常聪明地在两者…...
[创业之路-354]:农业文明到智能纪元:四次工业革命下的人类迁徙与价值重构
农业文明到智能纪元:四次工业革命下的人类迁徙与价值重构 从游牧到定居,从蒸汽轰鸣到算法洪流,人类文明的每一次跨越都伴随着生产关系的剧烈震荡。四次工业革命的浪潮不仅重塑了物质世界的生产方式,更将人类推向了身份认同与存在…...
敏感词 v0.25.0 新特性之 wordCheck 策略支持用户自定义
开源项目 敏感词核心 https://github.com/houbb/sensitive-word 敏感词控台 https://github.com/houbb/sensitive-word-admin 版本特性 大家好,我是老马。 敏感词一开始了内置了多种检验策略,但是很多用户在使用的过程中希望可以自定义策略。 所以 v0…...
从0到上线,CodeBuddy 如何帮我快速构建旅游 App?
引言 腾讯云AI代码助手之前就改成了CodeBuddy我相信这也是在为后期做准备。那么这篇文章会对CodeBuddy进行比较详细的介绍,并一起来上手实战,感受一下实际开发中这款插件能带给我们多少的便利。本篇文章是一边写一边进行测试,并不是测试完之…...
微信小程序 自定义组件 标签管理
环境 小程序环境: 微信开发者工具:RC 1.06.2503281 win32-x64 基础运行库:3.8.1 概述 基础功能 标签增删改查:支持添加/删除单个标签、批量删除、重置默认标签 数据展示:通过对话框展示结构化数据并支持复制 动…...
从 Eclipse Papyrus / XText 转向.NET —— SCADE MBD技术的演化
从KPN[1]的萌芽开始,到SCADE的推出[2],再到Scade 6的技术更迭[3],SCADE 基于模型的开发技术已经历许多。现在,Scade One 已开启全新的探索 —— 从 Eclipse Papyrus / XText 转向.NET 8跨平台应用。 [1]: KPN, Kahn进程网络 (197…...
【学习笔记】机器学习(Machine Learning) | 第五章(2)| 分类与逻辑回归
机器学习(Machine Learning) 简要声明 基于吴恩达教授(Andrew Ng)课程视频 BiliBili课程资源 文章目录 机器学习(Machine Learning)简要声明 二、决策边界决策边界的数学表达线性决策边界示例非线性决策边界非线性决策边界的示例…...
python 常用web开发框架及使用示例
Python常用Web开发框架及使用示例 Python拥有丰富的Web开发框架生态系统,以下是主流框架及其使用示例: 一、Flask - 轻量级框架 安装 pip install flask 基础示例 from flask import Flask, request, jsonifyapp Flask(__name__)app.route(/) def…...
[ Qt ] | 第一个Qt程序
1. 创建Qt项目 我们打开Qt Create工具,左上角“文件”,新建文件。 --- --- --- --- 这个是我们的APP“走出国门”的时候,要关注的,这里就不说了。 后面这两个直接默认,下一步就行~~。 2. 项目默认内容 下面就是Qt C…...
react + antd 实现后台管理系统
文章目录 完整路由搭建Layout 和 Aside组件引入 AntdAside组件实现 项目效果图 项目完整代码地址 https://gitee.com/lyh1999/react-back-management 项目完整代码地址 react依赖安装 最好采用yarn 安装 react-router 安装依赖 配置路由 history模式 / // src/router/…...
vue3+ts项目 配置vue-router
安装vue-router pnpm install vue-router配置 1.src/router/index.ts文件下的内容 import type { App } from vue import type { RouteRecordRaw } from vue-router import { createRouter, createWebHistory } from vue-router import remainingRouter from ./modules/remai…...
MySQL基本查询(二)
文章目录 UpdateDelete插入查询结果(select insert)聚合函数分组聚合统计 Update 1. 语法: set后面加列属性或者表达式 UPDATE table_name SET column expr [, column expr …][WHERE …] [ORDER BY …] [LIMIT …] 案例 将孙悟空同学的…...
MySQL:联合查询
目录 一、笛卡尔积 二、内连接 三、外连接 (1)左外连接 (2)右外连接 (3)全外连接 四、自连接 五、子查询 (1)单行子查询 (2)多行子查询 &…...
[算法学习]——通过RMQ与dfs序实现O(1)求LCA(含封装板子)
每周五篇博客:(3/5) 碎碎念 其实不是我想多水一篇博客,本来这篇是欧拉序的博客,结果dfs序也是可以O1求lca的,而且常数更优,结果就变成这样了。。。 前置知识 [算法学习]——dfs序 思想 分…...
复刻低成本机械臂 SO-ARM100 舵机配置篇(WSL)
视频讲解: 复刻低成本机械臂 SO-ARM100 舵机配置篇(WSL) 飞特舵机 组装之前需要配置舵机的ID,如下的网址为舵机的资料,实际上用不到,但可以mark在这里 Software-深圳飞特模型有限公司 User Guide里面可以…...
聊一聊接口测试更侧重于哪方面的验证
目录 一、功能性验证 输入与输出正确性 参数校验 业务逻辑覆盖 二、数据一致性验证 数据格式规范 数据完整性 数据类型与范围 三、异常场景验证 容错能力测试 边界条件覆盖 错误码与信息清晰度 四、安全与权限验证 身份认证 数据安全 防攻击能力 五、性能与可…...
【网络安全实验】SSL协议的应用
目录 一、SSL协议介绍 2.功能与特点 1)数据加密 2)身份验证 3)数据完整性校验 3.SSL的工作流程(握手过程) 1)客户端问候(ClientHello) 2)服务器响应(…...
测试——用例篇
目录 1. 测试用例 1.1 概念 2. 设计测试用例的万能公式 2.1 常规思考逆向思维发散性思维 2.2 万能公式 3. 设计测试用例例的方法 3.1 基于需求的设计方法 编辑 3.2 具体的设计方法 3.2.1 等价类 3.2.2 边界值 3.2.3 正交法 3.2.4 判定表法 3.2.5 场景法 3.2.6…...
计算机视觉技术的发展历程
计算机视觉技术的发展历程可以分为以下几个阶段: 早期探索阶段(1960s-1980s) 1960年代:计算机视觉的概念开始形成,研究者尝试让计算机识别和理解图像,主要集中在基础的图像处理,如边缘检测和特…...
docker 官方:在 alpine 上安装 python 的方法
在 alpine 上安装 python 的方法在 alpine 上安装 python 的方法: # alpine 官方 apk add python3 # docker 官方 docker pull python:3.11-alpine # 第三方 docker run --rm frolvlad/alpine-python3 python3 -c print("Hello World") # 编译安装 略 要点…...
mescroll.js 是在 H5端 运行的下拉刷新和上拉加载插件
1. mescroll的uni版本, 是专门用在uni-app的下拉刷新和上拉加载的组件, 支持一套代码编译到iOS、Android、H5、小程序等多个平台 2. mescroll的uni版本, 继承了mescroll.js的实用功能: 自动处理分页, 自动控制无数据, 空布局提示, 回到顶部按钮 .. 3. mescroll的uni版本, 丰富的…...
openEuler 22.03 安装 Mysql 5.7,RPM 在线安装
目录 一、检查系统是否安装其他版本Mariadb数据库二、安装 MySQL三、配置 MySQL四、修改默认存储路径五、开放防火墙端口六、数据备份七、生产环境优化八、常用命令 一、检查系统是否安装其他版本Mariadb数据库 # 查看已安装的 Mariadb 数据库版本 [rootopeneuler ~]# rpm -qa…...
云原生后端架构的挑战与应对策略
📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 随着云计算、容器化以及微服务等技术的快速发展,云原生架构已经成为现代软件开发和运维的主流趋势。企业通过构建云原生后端系统,能够实现灵活的资源管理、快速的应用迭代和高效的系统扩展。然而,尽管云原…...
第十六届蓝桥杯 2025 C/C++组 客流量上限
目录 题目: 题目描述: 题目链接: 思路: 打表找规律: 核心思路: 思路详解: 得到答案的方式: 按计算器: 暴力求解代码: 快速幂代码: 位运…...
LeetCode算法题 (移除链表元素)Day15!!!C/C++
https://leetcode.cn/problems/remove-linked-list-elements/description/ 一、题目分析 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 今天的题目非常好理解,也就是要删除…...
stm32 HAI库 SPI(一)原理
基本特点 通信方式:同步、串行(串行、并行、并发,别再傻傻分不清了!_串行和并行的区别-CSDN博客)、全双工 (也可以选择半双工)速率:50MHZ以下数据格式:8位/16位传输顺序…...
仿腾讯会议——主界面设计创建房间加入房间客户端实现
1、实现腾讯会议主界面 2、添加Qt类WeChatDialog 3、定义创建会议和加入会议的函数 4、实现显示名字、头像的函数 调用函数 5、在中间者类中绑定函数 6、实现创建房间的槽函数 7、实现加入房间的槽函数 8、设置界面标题 9、服务器定义创建和进入房间函数 10、服务器实现创建房间…...
在pycharm profession 2020.3上安装使用xlwings
之前写了一篇文章在win7和python3.8上安装xlwings-CSDN博客 今天安装了pycharm profession 2020.3,自带Terminal,所以试一下安装xlwings。 一、新建一个python项目 二、安装xlwings 三、输入安装命令 pip3.exe install -i https://pypi.tuna.tsinghu…...
Mybatis学习笔记
介绍 MyBatis 是一款优秀的持久层开发框架,它在 Java 开发中被广泛应用,以下是对它的详细介绍: 概述 MyBatis 最初是 Apache 的一个开源项目 iBatis,2010 年这个项目由 Apache Software Foundation 迁移到了 Google Code&#…...
「Mac畅玩AIGC与多模态13」开发篇09 - 基于多插件协同开发智能体应用(天气+名言查询助手)
一、概述 本篇介绍如何在 macOS 环境下,同时接入多个自定义 OpenAPI 插件,实现智能体根据用户请求自动分析,调用天气查询或名言查询服务,完成多功能协同应用开发。 二、环境准备 1. 确认本地开发环境 macOS 系统Dify 平台已部署并可访问可正常访问外部 API 服务2. 准备天…...
C++--入门基础
C入门基础 1. C的第一个程序 C继承C语言许多大多数的语法,所以以C语言实现的hello world也可以运行,C中需要把文件定义为.cpp,vs编译器看是.cpp就会调用C编译器编译,linux下要用g编译,不再是gcc。 // test.cpp #inc…...
Ubuntu环境下如何管理系统中的用户:创建用户、删除用户、修改密码、切换用户、用户组管理
管理用户的操作需要root权限,在执行命令时需要加sudo,关于sudo命令可以看这篇:Linux_sudo命令的使用与机制 1、添加用户 使用命令: adduser 用户名,主要是按提示输入密码和用户信息(可直接回车使用默认配置…...
广告事件聚合系统设计
需求背景 广告事件需要进行统计,计费,分析等。所以我们需要由数据接入,数据处理,数据存储,数据查询等多个服务模块去支持我们的广告系统 规模上 10000 0000个点击(10000 00000 / 100k 1wQPS) …...
PDF智能解析与知识挖掘:基于pdfminer.six的全栈实现
前言 在数字化信息爆炸的时代,PDF(便携式文档格式)作为一种通用的电子文档标准,承载着海量的结构化与非结构化知识。然而,PDF格式的设计初衷是用于展示而非数据提取,这使得从PDF中挖掘有价值的信息成为数据…...
VGG网络模型
VGG网络模型 诞生背景 VGGNet是牛津大学计算机视觉组核谷歌DeepMind一起研究出来的深度卷积神经网络。VGG是一种被广泛使用的卷积神经网络结构,其在2014年的ImageNet大规模视觉识别挑战中获得亚军。 通常所说的VGG是指VGG-16(13层卷积层3层全连接层)。具有规律的…...