ThreadLocal理解
1.thread是线程,threadLocal是对象?
在 Java 中:
Thread
是线程类,其实例代表线程:Thread
类用于创建和管理线程,每个线程都是Thread
类的一个实例,用于执行具体的任务,例如:
Thread thread = new Thread(() -> { // 线程执行的任务代码
});
thread.start(); // 启动线程
ThreadLocal
是一个类,其实例是对象:ThreadLocal
类的实例用于管理线程局部变量,为每个使用它的线程提供独立的变量副本。例如:
ThreadLocal<String> threadLocal = new ThreadLocal<>();
threadLocal.set("线程局部变量值");
因此,“thread
是线程(可理解为 Thread
类的实例),threadLocal
是对象(ThreadLocal
类的实例)” 这一说法是正确的。它们分别通过实例化来实现线程操作和线程局部变量管理的功能。
2.ThreadLocal 工作原理
ThreadLocal 是 Java 提供的线程局部变量机制,确保每个线程拥有独立的变量副本,实现线程间数据隔离。其核心原理如下:
- 线程与 ThreadLocalMap:每个
Thread
对象内部持有一个ThreadLocalMap
(类似哈希表),用于存储线程私有的变量。 - 键值存储:
ThreadLocalMap
以ThreadLocal
实例为键,以线程需要存储的值为值。当调用set(T value)
时,当前线程的ThreadLocalMap
会记录(this, value)
键值对;调用get()
时,通过当前ThreadLocal
实例作为键从当前线程的ThreadLocalMap
中获取对应值。 - 数据隔离:不同线程的
ThreadLocalMap
相互独立,因此线程间数据互不干扰,无需额外同步机制即可保证线程安全。
案例代码
public class ThreadLocalExample { private static ThreadLocal<Integer> threadLocal = new ThreadLocal<>(); public static void main(String[] args) { Thread thread1 = new Thread(() -> { threadLocal.set(10); System.out.println("Thread 1: " + threadLocal.get()); // 输出:Thread 1: 10 }); Thread thread2 = new Thread(() -> { threadLocal.set(20); System.out.println("Thread 2: " + threadLocal.get()); // 输出:Thread 2: 20 }); thread1.start(); thread2.start(); }
}
代码说明:
- 每个线程通过
threadLocal.set()
设置独立值,再通过threadLocal.get()
获取。 - 线程 1 和线程 2 的操作互不影响,各自输出自己设置的值,体现了线程间数据隔离。
通过这种方式,ThreadLocal 适用于存储线程特有数据(如用户会话信息、数据库连接等),避免多线程竞争,提升程序安全性和性能。
3.同一个线程中跨对象共享数据的例子
以下是一个使用 ThreadLocal
实现同一个线程中跨对象共享数据的典型案例,模拟 Web 应用中用户请求数据在过滤器(Filter)、控制器(Controller)和服务(Service)间的共享:
public class ThreadLocalCrossObjectExample {// 定义 ThreadLocal 用于存储用户 IDprivate static final ThreadLocal<String> CURRENT_USER_ID = new ThreadLocal<>();// 模拟 Filter 对象static class RequestFilter {public void doFilter() {// 假设从请求中获取用户 ID(实际场景可能从 token、会话等获取)String userId = "user_12345";CURRENT_USER_ID.set(userId); // 设置到 ThreadLocalSystem.out.println("Filter 设置用户 ID: " + userId);// 调用 Controller(模拟同一线程内的后续处理)new RequestController().handleRequest();}}// 模拟 Controller 对象static class RequestController {public void handleRequest() {String userId = CURRENT_USER_ID.get(); // 从 ThreadLocal 获取用户 IDSystem.out.println("Controller 获取用户 ID: " + userId);// 调用 Service(继续在同一线程内处理)new RequestService().process(userId);}}// 模拟 Service 对象static class RequestService {public void process(String userId) {// 也可直接通过 CURRENT_USER_ID.get() 获取,但为了演示跨对象传递System.out.println("Service 处理用户 ID: " + userId);// 清理 ThreadLocal(避免内存泄漏,实际 Web 场景中过滤器后置处理会清理)CURRENT_USER_ID.remove();}}public static void main(String[] args) {// 启动同一线程处理请求new RequestFilter().doFilter();}
}
代码说明:
ThreadLocal
定义:CURRENT_USER_ID
用于存储当前线程的用户 ID。RequestFilter
:模拟请求过滤器,从请求中获取用户 ID 并通过CURRENT_USER_ID.set(userId)
存入ThreadLocal
。RequestController
:模拟控制器,通过CURRENT_USER_ID.get()
从ThreadLocal
中获取用户 ID,无需参数传递即可共享数据。RequestService
:模拟服务层,接收或直接获取用户 ID 进行处理,最后通过CURRENT_USER_ID.remove()
清理ThreadLocal
,避免内存泄漏。
输出结果:
Filter 设置用户 ID: user_12345
Controller 获取用户 ID: user_12345
Service 处理用户 ID: user_12345
核心优势:
- 线程隔离:不同线程的
ThreadLocal
数据互不干扰,保证线程安全。 - 跨对象共享:无需通过方法参数层层传递数据,简化同一线程内不同对象间的数据共享逻辑。
- 避免同步开销:不涉及多线程竞争,无需加锁,提升性能。
此案例体现了 ThreadLocal
在实际开发中(如 Web 应用、事务管理等)跨对象共享线程特有数据的典型用法
4.如果对数据进行修改,会不会全部更改?
在使用 ThreadLocal
时,如果对其存储的数据进行修改,不会影响其他线程的数据,但可能会影响同一线程内不同对象对该数据的访问结果,下面详细解释:
线程间相互独立
ThreadLocal
的核心特性就是为每个使用该变量的线程都提供一个独立的变量副本,每个线程都可以独立地改变自己的副本,而不会影响其他线程所对应的副本。所以,一个线程对 ThreadLocal
中存储的数据进行修改,不会影响到其他线程中的数据。
同一线程内情况
在同一线程内,不同对象访问 ThreadLocal
中的数据时,它们操作的是同一个数据副本。如果修改了这个数据副本,那么同一线程内其他对象后续访问到的就是修改后的数据。
示例代码
以下代码展示了同一线程内修改 ThreadLocal
存储的数据对不同对象的影响:
public class ThreadLocalModificationExample {private static final ThreadLocal<String> threadLocal = new ThreadLocal<>();static class FirstObject {public void setData() {threadLocal.set("初始值");System.out.println("FirstObject 设置数据为: " + threadLocal.get());}}static class SecondObject {public void modifyData() {String data = threadLocal.get();System.out.println("SecondObject 获取到的数据: " + data);threadLocal.set(data + " - 修改后");System.out.println("SecondObject 修改数据为: " + threadLocal.get());}}static class ThirdObject {public void readData() {System.out.println("ThirdObject 获取到的数据: " + threadLocal.get());}}public static void main(String[] args) {FirstObject first = new FirstObject();SecondObject second = new SecondObject();ThirdObject third = new ThirdObject();first.setData();second.modifyData();third.readData();// 清理 ThreadLocalthreadLocal.remove();}
}
代码解释
FirstObject
类中的setData
方法将ThreadLocal
的值设置为"初始值"
。SecondObject
类中的modifyData
方法首先获取ThreadLocal
的值,然后对其进行修改,再重新设置回去。ThirdObject
类中的readData
方法读取ThreadLocal
的值,此时读取到的是修改后的值。
输出结果
FirstObject 设置数据为: 初始值
SecondObject 获取到的数据: 初始值
SecondObject 修改数据为: 初始值 - 修改后
ThirdObject 获取到的数据: 初始值 - 修改后
综上所述,在同一线程内,对 ThreadLocal
存储的数据进行修改会影响同一线程内其他对象对该数据的访问结果,但不同线程之间的数据是相互独立的。
5.ThreadLocal 的核心机制
ThreadLocal 的核心逻辑是:
每个线程通过 ThreadLocal.get()
获取的,是当前线程独有的对象副本。
-
如果这个对象是 不可变 的(如
String
、Integer
),线程间天然隔离,无任何数据不一致问题。 -
如果这个对象是 可变 的(如
List
、自定义对象),但每个线程的副本是独立的,那么线程修改的只是自己的副本,不会影响其他线程。
6.如果每个线程都对其副本进行了修改,最后上交到全局数据,那采用谁的
通俗易懂的解释
你可以把这个问题想象成 “小组作业交报告”:
-
场景:老师布置了一个小组作业,要求最终交一份报告。组内有3个成员(线程A、线程B、线程C),每个成员各自写自己的草稿(副本)。
-
问题:最后汇总时,发现大家对同一段内容的修改不同,该采用谁的版本?
1. 直接覆盖:最后交的人说了算(Last Write Wins)
-
规则:谁最后提交自己的草稿,就用谁的版本覆盖之前的。
-
例子:
-
线程A修改了余额为100元(先提交)。
-
线程B修改了余额为200元(后提交)。
-
最终全局数据余额变为 200元(线程B的修改生效)。
-
-
问题:线程A的修改被“吞掉”了,数据可能不符合实际业务逻辑。
2. 累加操作:所有人的修改都生效(适用于可叠加操作)
-
规则:所有线程的修改进行数学累加(如余额增减)。
-
例子:
-
线程A给余额+50元。
-
线程B给余额+100元。
-
最终全局数据余额变为 原值 + 150元。
-
-
要求:操作必须是可叠加的(如转账、计数器),不能是直接赋值。
3. 人工干预:冲突时需要手动选择(版本控制)
-
规则:当多个线程修改同一数据时,标记冲突并提示人工处理。
-
例子(类似Git合并冲突):
-
线程A修改标题为《方案A》。
-
线程B修改标题为《方案B》。
-
系统提示:“标题冲突,请手动选择保留哪一个”。
-
-
适用场景:内容协作工具(如腾讯文档、Git)。
4. 业务逻辑决定:按规则自动选择
-
规则:根据业务需求设计优先级(如“管理员修改优先”)。
-
例子(银行转账):
-
线程A:用户发起转账-100元。
-
线程B:系统自动扣款-200元。
-
规则:系统扣款优先级高于用户操作。
-
最终全局数据余额减少 200元(线程B生效)。
-
实际代码中的处理方式
场景:多线程更新用户余额
// 全局共享数据
public class Account {private int balance; // 余额
}// 线程A任务:余额+100
Runnable taskA = () -> {int localBalance = account.getBalance(); // 读副本:假设原值为0localBalance += 100;account.setBalance(localBalance); // 直接覆盖写回
};// 线程B任务:余额+200
Runnable taskB = () -> {int localBalance = account.getBalance(); // 读副本:假设原值为0localBalance += 200;account.setBalance(localBalance); // 直接覆盖写回
};
-
问题:如果线程A和B同时读取余额为0,A写回100后,B又写回200,最终余额为200(而不是预期的300)。
解决方案
方法1:加锁(悲观锁)
synchronized (account) {int localBalance = account.getBalance();localBalance += amount;account.setBalance(localBalance);
}
-
解释:线程A和B必须排队操作,A先加100,B读取到100后再加200,最终余额300。
方法2:原子操作(乐观锁)
AtomicInteger balance = new AtomicInteger(0);// 线程A
balance.addAndGet(100); // 原子操作:直接累加// 线程B
balance.addAndGet(200); // 原子操作:直接累加
-
结果:余额最终为300,无冲突。
总结
-
关键矛盾:多个线程修改副本后,谁的结果生效取决于 合并策略。
-
选择依据:
-
如果是数值增减,用 原子操作 或 累加规则。
-
如果是覆盖赋值,用 锁 或 最后提交生效。
-
如果是复杂内容,用 版本控制 或 人工干预。
-
-
核心原则:确保最终结果符合业务逻辑的真实意图,而不是简单覆盖。
相关文章:
ThreadLocal理解
1.thread是线程,threadLocal是对象? 在 Java 中: Thread 是线程类,其实例代表线程:Thread 类用于创建和管理线程,每个线程都是 Thread 类的一个实例,用于执行具体的任务,例如&…...
PyTorch、Flash-Attn、Transformers与Triton技术全景解析+环境包
PyTorch、Flash-Attn、Transformers与Triton技术全景解析 包好难找 这里是下载链接 添加链接描述 摘要 本文系统性地介绍了深度学习领域的四大关键技术框架:PyTorch、Flash-Attn、Hugging Face Transformers和Triton,分别从核心特性、技术优势、应用场…...
mindyolo填坑
1、按照gitee上的文档跑预测代码,跑不通 更改: 将predict.py复制到跟目录。如果是cpu(本地测试比较常见),那么正确的命令行是: python predict.py --device_targetCPU --config ./configs/yolov7/yolov7.…...
【C++】平衡二叉树(AVL树)迭代版
目录 前言: 一:判断一棵树是否为平衡二叉树 二:明确思路 1.为什么使用平衡二叉树 2.旋转 2.1 左旋 2.2 右旋 3.冲突节点 4.平衡因子 5.双旋 5.1 左右双旋(LR) 5.2 右左双旋(RL) 6.平衡因子的更新 7.冲突节点问题补充 三&…...
双链表详解
一、双向链表介绍 二、实现双向链表 1.定义双向链表的结构 2.双向链表的初始化 3.双向链表的尾插 4.双向链表的头插 5.双向链表的打印 6.双向链表的尾删 7.双向链表的头删 8.查找指定位置的数据 9.在指定位置之后插入数据 10.删除指定位置的数据 11.链表的销毁 三、…...
6.9.单源最短路径问题-BFS算法
一.前言: 问题1: 以上述图片为例,比如从G港到Y城,可以是G港->R城->Y城,也可以是G港->P城->Y城等,有很多条路径都可以实现从G港到Y城,但要从中找出G港到Y城距离最短的那一条路径&am…...
react js 查看字体效果
起因, 目的: 想查看某个字体,对中英文的支持情况。 效果图: 完整项目见这里, 需要积分下载,不然的话,显得太水了。 过程: AI 对话, 生成代码。我检查运行, 来回修改。写个博客,…...
GZIPInputStream 类详解
GZIPInputStream 类详解 GZIPInputStream 是 Java 中用于解压缩 GZIP 格式数据的流类,属于 java.util.zip 包。它是 InflaterInputStream 的子类,专门处理 GZIP 压缩格式(.gz 文件)。 1. 核心功能 解压 GZIP 格式数据(RFC 1952 标准)自动处理 GZIP 头尾信息(校验和、时…...
数字智慧方案6206丨智慧园区大数据整体解决方案(45页PPT)(文末有下载方式)
资料解读:智慧园区大数据整体解决方案 详细资料请看本解读文章的最后内容。 在数字化快速发展的当下,智慧园区成为推动产业升级和城市发展的关键力量。这份智慧园区大数据整体解决方案,融合前沿技术与创新理念,为园区的高效管理、…...
Linux系统常用命令、标准C库函数和系统调用
目录 一、常用命令 env echo $name 键值 export name unset name gcc -c xxx.c ar 命令 ar -r libxxx.a xxx1.o xxx2.o gcc -c -fpic xxx.c gcc -shared -fpic xxx1.c xxx2.c -o libxxx.so kill [-信号] PID kill -l 软链接:ln -s xxx yyy 硬链接&…...
【Linux】基础指令(2)
man linux中有很多指令,我们不可能全部记住,man是linux/unix系统中的手册页指令,当我们遇到不熟悉的命令可以用man来查看命令,函数,配置文件的详细使用说明。 man手册分为多个章节,详情如下: …...
“会话技术”——Cookie_(2/2)原理与使用细节
经过Cookie的快速入门与代码使用。如果想深入理解Cookie的技术实现,就得去理解它的原理。 且有些时候使用Cookie,还要根据需求设置存活期限以及确定Cookie获取范围等其他细节。最后,我们会总结Cookie这门客户端会话技术的作用。 一、原理 注…...
Linux操作系统--进程间通信(中)(命名管道)
目录 1.命名管道: 1.1创建一个命名管道 1.2匿名管道与命名管道的区别 1.3命名管道的打开规则 1.4例子1-用命名管道实现文件拷贝 1.5例子2-用命名管道实现server&client通信 1.命名管道: 毫不相关的进程进行进程间通信管道应用的一个限制就是只能…...
数据结构6 · BinaryTree二叉树模板
代码函数功能顺序如下: 1:destroy:递归删除树 2:copy:复制二叉树 3:preOrder:递归前序遍历 4:inOrder:递归中序遍历 5:postOrder:递归后续遍…...
ubuntu的libc 库被我 sudo apt-get --reinstall install libc6搞没了
我系统的libc 没了 今天为了运行一个开源的yuv 播放器,在运行的时候提醒 Inconsistency detected by ld.so: dl-call-libc-early-init.c: 37: _dl_call_libc_early_init: Assertion sym ! NULL failed!然后听从AI 的建议 当我去执行ls 时,系统提示 就这…...
cat file.tar.gz | tar -xzf - -C /target/dir两个减号之间为什么有个空格?是写错了吗?(管道命令后续)
在 tar 命令的参数 -xzf - -C 中,两个减号(-)之间的空格是故意保留的语法,没有写错。具体原因如下: 1. -xzf - 的语法解析 -xzf 是 tar 命令的组合参数: x:表示解压(extract&#x…...
手机的数据楚门世界是如何推送的
手机推送,也叫茧影算法,手机的数据“楚门世界”:信息推送机制的深度剖析与社会影响 在数字化时代,手机已然成为人们生活中不可或缺的伴侣。当我们沉醉于手机带来的便捷与娱乐时,或许未曾察觉,自己正置身于…...
体系结构论文(八十二):A Comprehensive Analysis of Transient Errors on Systolic Arrays
研究背景与动机 TPU架构(Tensor Processing Unit)广泛应用于DNN推理,其核心是脉动阵列,由大量的乘加单元(MAC)组成。 由于使用了纳米级CMOS技术,TPU对辐射引发的瞬态错误(SET&#…...
综合案例:使用vuex对购物车的商品数量和价格等公共数据进行状态管理
文章目录 0.实现需求1.新建购物车模块cart2.使用json-server模拟向后端请求数据3.在vuex请求获取并存入数据,并映射到组件中,在组件中渲染【重点】3.1.安装axios3.2.准备actions和mutations,获取和存入数据到vuex中3.3.动态渲染:用mapState映射 其他1.为什么在axios在项目中要局…...
二叉搜索树的判断(双指针解决)
98. 验证二叉搜索树 - 力扣(LeetCode) class Solution { public:TreeNode*preNULL;bool isValidBST(TreeNode* root) {if(rootNULL){return true;}bool leftisValidBST(root->left);if(pre!NULL&&pre->val>root->val){return fals…...
关于CSDN创作的常用模板内容
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 好文评论新文推送 📃文章前言 &…...
不小心误删了文件,找Windows数据恢复工具来帮忙
相信很多人都遇到过这样的情况:不小心在电脑上删除了一些重要的文件,等到想要找回来时,却感觉特别棘手。 今天我要给大家推荐一款超棒的Windows数据恢复工具,它能轻松帮你找回那些被误删的文件。 (文末附下载链接&…...
[Verilog]跨时钟域数据传输解决方案
跨时钟域数据传输解决方案 摘要:跨时钟域数据传输 (Clock Domain Crossing, CDC) 是 SoC 设计中常见且关键的问题,因为现代 SoC 通常包含多个时钟域,不同模块可能运行在不同频率或相位的时钟下。跨时钟域传输数据时,如果处理不当,可能会导致亚稳态 (Metastability)…...
Linux——进程终止/等待/替换
前言 本章主要对进程终止,进程等待,进程替换的详细认识,根据实验去理解其中的原理,干货满满! 1.进程终止 概念:进程终止就是释放进程申请的内核数据结构和对应的代码和数据 进程退出的三种状态 代码运行…...
数据结构与算法:图论——最短路径
最短路径 先给出一些leetcode算法题,以后遇见了相关题目再往上增加 最短路径的4个常用算法是Floyd、Bellman-Ford、SPFA、Dijkstra。不同应用场景下,应有选择地使用它们: 图的规模小,用Floyd。若边的权值有负数,需要…...
双指针(5)——有效三角形个数
题目: 这道题我们首先可能会想到暴力解法,三个for循环然后进行check()。时间复杂度肯定是不允许的。 同时,验证可以组成三角形的条件是任意两边之和大于第三边,这就意味着我们每组要进行三次比较。但也有捷…...
Qt QGraphicsScene 的用法
背景,为什么要写这篇博客 今天学习 model - view 模式的时候还看到有 scene - view 模式。不知道还有这个模式,所以学习了下。 学习后总体的感觉是:其实没有也是可以的,但有了方便许多。 从两种画图的方法开始说 以前有个项目也…...
使用 Tesseract 实现藏文OCR
要识别藏文,最常用且有效的方法是使用Tesseract OCR(谷歌开源的OCR工具),因为它拥有针对藏文的预训练模型支持。 🚀 一、安装 Tesseract OCR 软件: 下载链接:Tesseract OCR 下载页面 Windows用…...
数字智慧方案5873丨智慧交通设计方案(57页PPT)(文末有下载方式)
资料解读:智慧交通设计方案 详细资料请看本解读文章的最后内容。 智慧交通设计方案是一份详尽的交通规划文件,旨在通过科学的交通设计方法,优化交通系统,提升交通效率,确保交通安全,并促进可持续发展。该…...
【quantity】6 温度单位实现(temperature.rs)
一源码 以下代码实现了一个温度单位系统,支持开尔文(Kelvin)和摄氏度(Celsius)之间的转换和运算。 /// Temperature (kelvin) / 温度 (开尔文) use super::{Quantity, prefix::*}; use crate::unit::Kelvin; use derive_more::{Add, Sub, AddAssign, SubAssign};/…...
ARConv的复现流程
使用环境 Python 3.10.16 torch 2.1.1cu118 torchvision 0.16.1cu118 其它按照官方提供代码的requirements.txt安装 GitHub - WangXueyang-uestc/ARConv: Official repo for Adaptive Rectangular Convolution 数据准备 从官方主页下载pancollection数据集PanCollection…...
安卓游戏APK文件解密与编辑的完整攻略
在移动游戏开发中,保护游戏数据不被篡改是开发者的重要任务。然而,随着逆向工程技术的发展,破解游戏数据也变得可能。本文将详细介绍如何分析、解密和编辑APK安装包中的加密JSON文件,特别关注assets/task目录下的文件,并提供一种绕过checkfile.json中MD5校验的有效方法。通…...
JVM——JVM 是如何执行方法调用的?
JVM 是如何执行方法调用的? 在 Java 世界的底层运作中,方法调用机制是理解 Java 虚拟机(JVM)行为的关键之一。JVM 作为 Java 程序运行的核心,承担着执行字节码、管理内存、调度线程等多项职责。而方法调用作为程序逻辑…...
一天学完JDBC!!(万字总结)
文章目录 JDBC是什么 1、环境搭建 && 入门案例2、核心API理解①、注册驱动(Driver类)②、Connection③、statement(sql注入)④、PreparedStatement⑤、ResultSet 3、jdbc扩展(ORM、批量操作)①、实体类和ORM②、批量操作 4. 连接池①、常用连接池②、Durid连接池③、Hi…...
【愚公系列】《Manus极简入门》011-习惯养成教练:“习惯塑造师”
🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! …...
精益数据分析(38/126):SaaS模式的流失率计算优化与定价策略案例
精益数据分析(38/126):SaaS模式的流失率计算优化与定价策略案例 在创业和数据分析的领域中,我们不断探索如何更精准地把握业务发展的关键要素。今天,带着与大家共同进步的想法,深入研读《精益数据分析》&a…...
50.【必备】二分答案法与相关题目
本文的网课内容学习自B站左程云老师的算法详解课程,旨在对其中的知识进行整理和分享~ 网课链接:算法讲解051【必备】二分答案法与相关题目_哔哩哔哩_bilibili 一.爱吃香蕉的珂珂 题目:爱吃香蕉的珂珂 算法原理 整体思路 这是一个二分查找算法…...
C# 方法(局部变量和局部常量)
本章内容: 方法的结构 方法体内部的代码执行 局部变量 局部常量 控制流 方法调用 返回值 返回语句和void方法 局部函数 参数 值参数 引用参数 引用类型作为值参数和引用参数 输出参数 参数数组 参数类型总结 方法重载 命名参数 可选参数 栈帧 递归 局部变量 和第5章介绍的字段…...
MQTT 协议与 HTTP 协议的区别
在现代的网络通信中,MQTT 协议和 HTTP 协议都扮演着重要的角色,但它们有着不同的特点和适用场景。下面我们就从多个方面来详细探讨它们之间的区别。 一.协议设计理念 1. MQTT 协议 MQTT(Message Queuing Telemetry Transport)即…...
博弈论思维——AI与思维模型【90】
一、定义 博弈论思维模型是一种研究在相互影响的决策情境中,参与者如何通过策略选择来实现自身利益最大化的理论框架。它分析参与者之间的相互作用、策略组合以及由此产生的结果,帮助人们理解在竞争或合作环境下的决策逻辑和行为模式。 二、由来 博弈…...
【Bootstrap V4系列】学习入门教程之 表格(Tables)和画像(Figure)
Bootstrap V4系列 学习入门教程之 表格(Tables)和画像(Figure) 表格(Tables)一、Examples二、Table head options 表格头选项三、Striped rows 条纹行四、Bordered table 带边框的表格五、Borderless table…...
第 3 篇:有序的世界:有序表 (TreeMap/TreeSet) 的概念与优势
上一篇我们探讨了哈希表如何以牺牲顺序为代价换取极致的平均速度。然而,在现实世界的许多应用中,数据的有序性不仅是锦上添花,甚至是核心需求。想象一下: 你需要显示一个按价格排序的商品列表。你需要找到某个时间点之前或之后的…...
VulnHub-DC-2靶机
主机发现 sudo arp-scan -l 以sudo管理员权限扫描本地活动ip地址 Interface: eth0, type: EN10MB, MAC: 08:00:27:22:46:4f, IPv4: 192.168.252.230 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.252.6 4c:5f:70:74:3c:3b …...
论文笔记(八十三)STACKGEN: Generating Stable Structures from Silhouettes via Diffusion
STACKGEN: Generating Stable Structures from Silhouettes via Diffusion 文章概括摘要I. INTRODUCTIONII. 相关工作A. 从直觉物理学学习稳定性B. 用于姿态生成的扩散模型C. 自动化顺序装配 III. 方法A. 用于 S E ( 3 ) SE(3) SE(3)积木姿态生成的扩散模型B. 模型架构C. 数据生…...
论文阅读笔记——TesserAct: Learning 4D Embodied World Models
TesserAct 论文 采用RGB-DN(RGB深度法线) 作为 4D 场景中间表示,由此建模 4D 场景,比纯 2D 视频更准确地建模 3D 几何结构。相比现有的 4D 视频生成,优化速度快,收敛好,且首次从当前帧和文本描述…...
变转速振动信号分析处理与故障诊断算法模块
变转速振动信号分析处理与故障诊断算法模块,作为信号处理算法工具箱的主要功能模块,形成了以变转速振动信号分析处理与故障诊断算法模块的经典算法模型,可应用于各类关键机械部件(轴承、齿轮、转子等)的信号分析、故障…...
每日算法-250502
每日算法 - 2025.05.02 记录一下今天刷的几道 LeetCode 算法题。 3191. 使二进制数组全部等于 1 的最少操作次数 I 题目 思路 贪心 解题过程 遍历数组 nums。当我们遇到 nums[i] 时: 如果 nums[i] 是 1,我们不需要进行操作,因为目标是全 …...
如何在纯C中实现类、继承和多态(小白友好版)
基本实现原理 /* 通过结构体函数指针模拟类 */ typedef struct {// 成员变量int x; // 成员方法(函数指针) void (*print)(void* self); } MyClass;/* 成员函数实现 */ void my_print(void* self) {MyClass* obj (MyClass*)self;p…...
AE/PR插件 转场创建大师专业版 Transition Master Pro v2.0.2 Win+使用教程
Transition Master Pro v2.0.2是一款原生转场插件,专为Adobe Premiere Pro和After Effects设计。它提供了创建、导出和销售自己的转场效果,或从一个庞大的转场预设库中选择。使用Transition Master Pro v2.0.2,您可以快速轻松地创建令人惊叹的…...
[Linux]从零开始的STM32MP157 Buildroot根文件系统构建
一、前言 在前面的教程中,教了大家如何移植一个LInux的内核并且正确启动,我们发现Linux内核在启动后会出现一个错误,提示我们没有找到根文件系统。那么什么是根文件系统呢?之前我们使用Ubuntu编译了STM32MP157的TF-A,UBOOT,LINUX内…...