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

深入剖析ThreadLocal:原理、应用与最佳实践


深入剖析ThreadLocal:原理、应用与最佳实践


一、ThreadLocal的本质与价值

1.1 什么是ThreadLocal?

ThreadLocal是Java提供的线程本地变量机制,允许每个线程拥有独立的变量副本,实现线程间的数据隔离。它通过“空间换时间”的方式,避免了多线程竞争共享资源时的同步开销。

1.2 核心应用场景
  • 线程封闭:将非线程安全的对象(如SimpleDateFormat)封装为线程私有
  • 跨层级传参:在调用链中隐式传递上下文(如用户身份、事务ID)
  • 全局访问点:为线程提供全局但独立的数据存储(如数据库连接)

二、底层实现深度解析

2.1 核心类关系
Thread
└── ThreadLocalMap(线程私有)├── Entry[] table└── Entry extends WeakReference<ThreadLocal<?>>
2.2 ThreadLocalMap设计精妙
  • 哈希表结构:初始容量16,负载因子2/3,扩容阈值=len*2/3
  • 冲突解决:开放寻址法(线性探测)
  • 键值设计
    • Key:弱引用ThreadLocal实例(防止内存泄漏)
    • Value:强引用存储值(需手动管理)
2.3 核心方法源码解析
// set()方法核心逻辑
public void set(T value) {Thread t = Thread.currentThread();ThreadLocalMap map = getMap(t);if (map != null) {map.set(this, value);} else {createMap(t, value);}
}// ThreadLocalMap.set()关键实现
private void set(ThreadLocal<?> key, Object value) {Entry[] tab = table;int len = tab.length;int i = key.threadLocalHashCode & (len-1);for (Entry e = tab[i]; e != null; e = tab[i = nextIndex(i, len)]) {ThreadLocal<?> k = e.get();if (k == key) {e.value = value;return;}if (k == null) {replaceStaleEntry(key, value, i);return;}}tab[i] = new Entry(key, value);// ...后续扩容检查
}

三、高级应用模式

3.1 Spring的RequestContextHolder实现
// Spring框架源码节选
public abstract class RequestContextHolder {private static final ThreadLocal<RequestAttributes> requestAttributesHolder =new NamedThreadLocal<>("Request attributes");public static void setRequestAttributes(RequestAttributes attributes) {if (attributes == null) {resetRequestAttributes();} else {requestAttributesHolder.set(attributes);}}
}
3.2 分布式跟踪ID传递
public class TraceContext {private static final ThreadLocal<String> TRACE_ID = new ThreadLocal<>();public static void startTrace() {TRACE_ID.set(UUID.randomUUID().toString());}public static String getTraceId() {return TRACE_ID.get();}public static void endTrace() {TRACE_ID.remove();}
}
3.3 动态数据源路由
public class DataSourceRouter {private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();public static void setDataSource(String dsName) {contextHolder.set(dsName);}public static String getDataSource() {return contextHolder.get();}
}// 使用AOP实现注解驱动
@Around("@annotation(ds)")
public Object around(ProceedingJoinPoint pjp, DataSource ds) throws Throwable {try {DataSourceRouter.setDataSource(ds.value());return pjp.proceed();} finally {DataSourceRouter.clear();}
}

四、内存泄漏全景分析

4.1 泄漏形成路径
ThreadLocal实例不再使用
Entry.Key变为null
Entry.Value无法访问
线程池线程长期存活
内存泄漏
4.2 防护策略对比
策略优点缺点
手动remove()精确控制依赖开发人员自觉
使用static修饰减少实例数量不能根本解决问题
继承WeakReference自动回收KeyValue仍需手动清理
自动清理机制无需人工干预实现复杂度高

五、最佳实践指南

5.1 使用规范
  1. 变量修饰:始终使用static final修饰
    private static final ThreadLocal<SimpleDateFormat> formatter = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd"));
    
  2. 初始值设置:推荐使用withInitial方法
  3. 清理策略:try-finally代码块强制清理
    try {threadLocal.set(value);// 业务逻辑
    } finally {threadLocal.remove();
    }
    
5.2 性能优化技巧
  • Entry复用:对高频访问的变量进行缓存
  • 容量预估:避免频繁扩容带来的rehash
  • 批量清理:自定义removeStaleEntries方法
5.3 监控方案
// 检查线程的ThreadLocalMap使用情况
public static void monitorThreadLocals() {Thread thread = Thread.currentThread();Field threadLocalsField = Thread.class.getDeclaredField("threadLocals");threadLocalsField.setAccessible(true);Object threadLocalMap = threadLocalsField.get(thread);// 通过反射获取table数组Field tableField = threadLocalMap.getClass().getDeclaredField("table");tableField.setAccessible(true);Object[] entries = (Object[]) tableField.get(threadLocalMap);int count = 0;for (Object entry : entries) {if (entry != null) count++;}System.out.println("当前线程ThreadLocalMap使用量: " + count);
}

六、常见问题解决方案

6.1 线程池环境下的"脏数据"

现象:线程复用导致前次请求数据残留
方案

  1. 使用阿里TransmittableThreadLocal
  2. 任务执行前后清理上下文
executor.submit(() -> {try {// 拷贝上下文到当前线程Context context = backupContext();// 执行业务逻辑} finally {cleanContext();}
});
6.2 异步编程中的上下文传递
CompletableFuture.supplyAsync(() -> {// 获取父线程上下文String traceId = TraceContext.get(); // 业务处理
}, new ContextAwareExecutor());
6.3 跨线程数据继承
Thread parent = Thread.currentThread();
new Thread(() -> {// 自动继承InheritableThreadLocal值String config = parent.getInheritableThreadLocal().get();// 使用配置
}).start();

七、与其它并发工具对比

特性ThreadLocalsynchronizedLock
数据可见范围线程私有全局可见全局可见
性能消耗无锁,低开销高竞争时性能差中等
内存占用每个线程独立存储无额外存储无额外存储
适用场景上下文传递临界区保护复杂锁操作

八、总结与展望

正确使用ThreadLocal的四个维度

  1. 生命周期管理:严格遵循"谁设置,谁清理"原则
  2. 作用域控制:合理设计变量的可见范围
  3. 性能调优:关注哈希冲突和空间利用率
  4. 监控预警:建立内存使用监控机制

未来演进方向

  • 与虚拟线程(Project Loom)的兼容性
  • 自动内存管理机制的改进
  • 更智能的泄漏检测工具

通过深入理解ThreadLocal的底层机制,结合具体业务场景合理应用,开发者可以在保证线程安全的同时,显著提升系统性能和代码可维护性。

相关文章:

深入剖析ThreadLocal:原理、应用与最佳实践

深入剖析ThreadLocal&#xff1a;原理、应用与最佳实践 一、ThreadLocal的本质与价值 1.1 什么是ThreadLocal&#xff1f; ThreadLocal是Java提供的线程本地变量机制&#xff0c;允许每个线程拥有独立的变量副本&#xff0c;实现线程间的数据隔离。它通过“空间换时间”的方式…...

nginx 配置后端健康检查模块

nginx自带的针对后端节点健康检查的功能比较简单,通过默认自带的ngx_http_proxy_module 模块和ngx_http_upstream_module模块中的参数来完成,当后端节点出现故障时,自动切换到健康节点来提供访问。但是nginx不能事先知道后端节点状态是否健康,后端即使有不健康节点,负载均…...

路由交换实验

案例一&#xff1a;实施和配置RIPV2 1.给AR1配置接口 查看R1接口配置情况 2.配置三台路由的RIP协议&#xff0c;版本为version2 &#xff0c;关闭自动汇总&#xff0c;通告所有的直连接口 案例二&#xff1a;配置多区域的OSPF协议 1.配置R1的接口IP地址参数 2.配置r2,r3的接口参…...

主成分分析(PCA)是什么?简易理解版

文章目录 一、PCA的本质与核心价值二、数据中的"重要方向"&#xff1a;理解变异性三、主成分的数学基础四、荷载向量的深入理解五、PCA的计算过程详解5.1 数据预处理5.2 计算协方差矩阵5.3 特征分解5.4 主成分得分计算 六、PCA的实际应用解读七、PCA的工具与实现7.1 …...

Linux常用命令34——uname显示系统内核信息

在使用Linux或macOS日常开发中&#xff0c;熟悉一些基本的命令有助于提高工作效率&#xff0c;uname命令来自英文词组UNIX name的缩写&#xff0c;其功能是查看系统主机名、内核及硬件架构等信息。如果不加任何参数&#xff0c;默认仅显示系统内核名称&#xff08;相当于-s参数…...

Linux下使用openssh搭建sftp服务

创建 SFTP 用户组 为 SFTP 用户创建一个专用组&#xff1a; sudo groupadd sftpusers 创建 SFTP 用户 创建 SFTP 用户并将其添加到 sftpusers 组&#xff0c;同时指定用户的主目录和禁止 shell 访问&#xff1a; sudo useradd -g sftpusers -s /sbin/nologin username sud…...

C++ 复习(一)

命名空间 概念 &#xff1a; 命名空间的主要作用是创建一个新的作用域 里面可以放函数 变量 定义 为了防止命名冲突 实现 : 通过使用namespace 空间名 {} 在大括号中添加 内容 1. 这里命名空间允许嵌套 2. 在同一个工程中允许存在多个同名的命名空间 在最后编译…...

主备Smart Link + Monitor Link组网技术详细配置

1.实验拓扑 2.使用设备 eNSP模拟建议下行设备三台使用S3700模拟&#xff08;全部使用S5700可能会出现流量丢失等异常问题。&#xff09; 3.实验配置 [SW1]dis cu # sysname SW1 # vlan batch 100 110 # interface Ethernet0/0/1port link-type accessport default vlan 100 …...

【5G通信】redcap和bwp 随手记

在5G通信中&#xff0c;BWP&#xff08;Bandwidth Part&#xff09;是一种技术&#xff0c;允许终端设备在不同的带宽部分上进行通信&#xff0c;从而提高频谱效率和灵活性。BWP可以分为初始BWP&#xff08;Initial BWP&#xff09;、默认BWP&#xff08;Default BWP&#xff0…...

第三天 车联网云架构

一、车联网技术演进与行业变革 1.1 从传统Telematics到智能网联汽车 当我们驾驶着搭载智能网联系统的汽车时&#xff0c;车辆每秒会产生超过1GB的数据流量。这些数据包括&#xff1a; 高精度地图的实时更新ADAS传感器采集的环境信息车载娱乐系统交互数据车辆状态监控信息 传…...

手撕基于AMQP协议的简易消息队列-7(客户端模块的编写)

在MQClient中编写客户端模块代码 在MQClient中编写makefile文件来编译客户端模块 .PHONY:all all:PublichClient ConsumeClient PublichClient : PublichClient.cpp ../MQCommon/request.pb.cc ../MQCommon/message.pb.cc ../ThirdLib/lib/include/muduo/protobuf/codec.ccg …...

Spring Security(笔记)

第一步&#xff1a; 首先使用Intellij IDEA创建一个Spring Boot项目&#xff0c;JDK选择自己安装的1.8。点击Next后&#xff0c;编辑项目信息。然后跳转到选择依赖页面。 第二步&#xff1a; 添加Spring Security、Spring Web、Thymeleaf三个依赖。完成后等待项目构建完成。…...

通义灵码编码插件支持MCP

通义灵码MCP功能集成概述 通义灵码已深度集成魔搭社区&#xff08;ModelScope&#xff09;的MCP&#xff08;Model Context Protocol&#xff09;服务&#xff0c;为开发者提供了在IDE中直接调用AI能力的便捷通道。MCP作为标准化协议&#xff0c;通过定义Resources、Prompts和…...

问题 | 当前计算机视觉迫切解决的问题

当前计算机视觉领域虽然在技术上取得了显著进展&#xff0c;但仍面临一系列关键挑战。结合最新研究与应用现状&#xff0c;以下是最迫切需要解决的几大问题&#xff1a; 1. 数据质量与多样性不足 高质量标注数据的获取&#xff1a;训练高效模型依赖大量精准标注的数据&#x…...

C++ STL入门:vecto容器

C STL 系列入门&#xff1a;vector 动态数组 一、vector 容器核心特性 vector 是 C 标准库提供的动态数组容器&#xff0c;具有以下显著优势&#xff1a; 自动扩容机制&#xff1a;当插入元素超出当前容量时&#xff0c;自动申请新内存并迁移数据随机访问效率&#xff1a;支持…...

Java 线程全面概述

Java 线程全面概述 线程是程序执行的最小单元&#xff0c;是操作系统能够调度的最小单位。Java 提供了完善的线程支持&#xff0c;下面从基础概念到高级特性进行全面解析。 一、线程基础概念 1. 线程 vs 进程 特性进程线程资源占用独立内存空间共享进程内存切换成本高&#…...

高效文件夹迁移工具,轻松实现批量文件管理

软件介绍 DirMapper是一款专注于文件夹迁移的工具&#xff0c;可以快速完成文件的批量整理与位置调整。 功能特点 这款文件夹迁移工具提供两种操作模式&#xff1a;复制模式和移动模式&#xff0c;用户可以根据需求自行选择。如果需要保留原文件&#xff0c;可以选择复…...

sherpa:介绍

更多内容&#xff1a;XiaoJ的知识星球 目录 1. sherpa 介绍 1. sherpa 介绍 sherpa是 Next-gen Kaldi 项目的部署框架。 sherpa 支持在各种平台上部署与语音相关的预训练模型&#xff0c;并提供多种语言绑定。 目前&#xff0c;sherpa 拥有以下子项目&#xff1a; k2-fsa/sh…...

Android Studio Gradle 中 只显示 Tasks 中没有 build 选项解决办法

一、问题描述 想把项目中某一个模块的代码单独打包成 aar ,之前是点击 AndroidStudio 右侧的 Gradle 选项&#xff0c;然后再点击需要打包的模块找到 build 进行打包&#xff0c;但是却发现没有 build 选项。 二、解决办法 1、设置中勾选 Configure all Gradle tasks… 选项 …...

手撕基于AMQP协议的简易消息队列-6(服务端模块的编写)

在MQServer中编写服务端模块代码 在MQServer中编写makefile文件来编译服务端模块 .PHONY: server CFLAG -I../ThirdLib/lib/include LFLAG -L../ThirdLib/lib/lib -lgtest -lprotobuf -lsqlite3 -pthread -lmuduo_net -lmuduo_base -lz server:server.cpp ../MQCommon/messag…...

面试实践AND面经热点题目总结

1、对于Rocketmq消息积压、丢失如何解决&#xff1f; 消息积压原因以及解决方案 &#x1f3af; 产生原因&#xff1a; 消费者处理能力弱&#xff0c;消费速度远低于生产速度&#xff1b; 网络不稳定&#xff0c;消费者拉取消息失败&#xff1b; 消费端异常&#xff08;如处理…...

MySQL基础关键_012_事务

目 录 一、概述 二、ACID 四大特性 三、MySQL 事务 四、事务隔离级别 1.说明 2.现象 &#xff08;1&#xff09;脏读 &#xff08;2&#xff09;不可重复读 &#xff08;3&#xff09;幻读 3.查看隔离级别 4.设置隔离级别 5.隔离级别 &#xff08;1&#xff09;初始…...

Missashe考研日记-day35

Missashe考研日记-day35 1 专业课408 学习时间&#xff1a;3h学习内容&#xff1a; 完结撒花&#xff01;&#xff01;今天把OS最后一节的内容学完了&#xff0c;操作系统也算是告一段落了&#xff0c;接下来是计网时间&#xff01;不过计网我是上学期才学过的&#xff0c;当…...

如何添加二级域名

在 华为云 上添加二级域名&#xff08;如 sub.example.com&#xff09;主要涉及 DNS解析配置 和 服务器绑定 两个步骤。以下是详细操作指南&#xff1a; 一、前提条件 已拥有 主域名&#xff08;如 example.com&#xff09;并完成 ICP备案&#xff08;若服务器在中国大陆&#…...

【数据结构】01Trie

什么是 01Trie? 01Trie是字典树的一种变种&#xff0c;其只有两种情况&#xff0c;即 0 和 1&#xff0c;实现方式其实和字典树是一样的 有什么用呢&#xff1f; 其一般用于解决异或问题&#xff0c;是一种快速的数据结构&#xff0c;某些情况下可以无脑套用 实现方式&#…...

使用 CDN 在国内加载本地 PDF 文件并处理批注:PDF.js 5.x 实战指南

PDF.js 是一个强大的开源 JavaScript 库&#xff0c;用于在 Web 浏览器中渲染 PDF 文件。它由 Mozilla 开发&#xff0c;能够将 PDF 文档绘制到 HTML5 Canvas 或 SVG 上&#xff0c;无需任何本机代码或浏览器插件。对于许多需要在网页中展示 PDF 内容的应用场景来说&#xff0c…...

SpringBoot指定项目层日志记录

1、新建一个Springboot项目&#xff0c;添加Lombok依赖&#xff08;注意&#xff1a;这里使用的Lombok下的Slf4j快速日志记录方式&#xff09; <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependenc…...

使用Mathematica内置函数绘制Sierpinski地毯

除了SierpinskiCurve之外&#xff0c;Mathematica还内置了SierpinskiMesh这个函数&#xff0c;用来绘制地毯。 SierpinskiMesh[n] gives a mesh region representing the n-step Sierpiński triangle. SierpinskiMesh[n,d] gives the n-step Sierpiński sponge in dimension…...

CMake笔记(简易教程)

CMake笔记 概述&#xff08;需要提前了解的知识&#xff09; 一个c/c程序从代码到生成二进制文件&#xff0c;需要经历的几个关键步骤&#xff1a;预编译&#xff08;预处理&#xff09;、编译、汇编、连接 【编译链接的几个步骤】 编译器&#xff1a;目前市面常见的编译器有…...

现代健康养生新范式:多维度守护身心活力

在快节奏的现代生活中&#xff0c;健康养生是维持高品质生活的关键。从环境调节到生活习惯养成&#xff0c;多个维度的协同发力&#xff0c;才能为健康注入持久动力。​ 良好的生活环境是健康的基础。室内空气流通至关重要&#xff0c;每天开窗通风 2-3 次&#xff0c;每次 30…...

推测式思维树:让大模型快速完成复杂推理

论文标题 Accelerating Large Language Model Reasoning via Speculative Search 论文地址 https://www.arxiv.org/pdf/2505.02865 作者背景 中科大&#xff0c;华为诺亚方舟实验室&#xff0c;天津大学 ICML 2025接收 动机 之前介绍过多篇投机解码&#xff08;推测式解…...

软考错题(三)

telnet协议是一种基于TCP的远程登录协议 占用辅助空间最多的是归并排序 直接插入&#xff0c;堆排&#xff0c;简单选择&#xff0c;冒泡的空间复杂度是O(1) 快排是O(logn) 归并是O(n) B树的叶子节点通过指针链接为有序表&#xff0c;不是b-树 python中切片语法[start,end,s…...

注解的定义

一、理论说明 1. 注解的定义 Java 注解是从 JDK 5.0 开始引入的一种元数据机制&#xff0c;它可以为代码添加额外的信息&#xff0c;这些信息不影响程序的运行逻辑&#xff0c;但可以在编译期、类加载期或运行期被读取和处理。注解本质上是一种特殊的接口&#xff0c;所有注解…...

企业微信自建消息推送应用

企业微信自建应用来推送消息 前言 最近有个给特定部门推送消息的需求&#xff0c;所以配置一个应用专门用来推送消息。实现过程大致为&#xff1a;服务器生成每天的报告&#xff0c;通过调用API来发送消息。以前一直都是发邮件&#xff0c;整个邮箱里全是报告文件&#xff0c…...

swagger3融入springboot

标签&#xff1a; 放controller上面 Api(description "xxx") 放方法上面 Operation(summary "xxx") 引入&#xff1a; 我用的是swagger3.X 需要在yml配置文件中加上&#xff1a; spring:mvc:pathmatch:matching-strategy: ant_path_matcher 然后生…...

CH32V208GBU6沁恒绑定配对获取静态地址

从事嵌入式单片机的工作算是符合我个人兴趣爱好的,当面对一个新的芯片我即想把芯片尽快搞懂完成项目赚钱,也想着能够把自己遇到的坑和注意事项记录下来,即方便自己后面查阅也可以分享给大家,这是一种冲动,但是这个或许并不是原厂希望的,尽管这样有可能会牺牲一些时间也有哪天原…...

[计算机科学#11]:编程语言简史,从二进制到简约表达的华丽转身,造就原因——“懒”

【核知坊】&#xff1a;释放青春想象&#xff0c;码动全新视野。 我们希望使用精简的信息传达知识的骨架&#xff0c;启发创造者开启创造之路&#xff01;&#xff01;&#xff01; 内容摘要&#xff1a; 由于早期的编程需要直接操作硬件&#xff0c;例如使…...

Kubernetes HPA 深度解析:生产环境自动扩缩容实战指南

一、HPA 核心原理剖析 1. 运作机制三步曲 (图示&#xff1a;指标采集 → 决策计算 → 执行扩缩容的完整闭环) 指标采集层&#xff1a;通过 Metrics Server/Prometheus 等组件实时收集 CPU、内存或自定义指标决策计算层&#xff1a;根据当前指标值与目标阈值的比例计算所需副本…...

Matlab 四分之一车体被动和模糊控制对比

1、内容简介 Matlab215-四分之一车体被动和模糊控制对比 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...

pm2如何执行脚本批量启动多个服务

在 PM2 中批量启动多个服务&#xff0c;可以通过以下几种高效方式实现&#xff0c;具体操作如下&#xff1a; 方法1&#xff1a;使用 ecosystem.config.js 配置文件&#xff08;推荐&#xff09; 步骤1&#xff1a;生成配置文件 在项目根目录运行以下命令&#xff0c;生成模板…...

Debian系统详解

以下是关于 Debian 操作系统 的超详细深度解析&#xff0c;涵盖历史、架构、功能特性、管理细节及应用场景等方面&#xff0c;帮助你全面掌握这一经典 Linux 发行版&#xff1a; 一、Debian 概述&#xff1a;开源社区的基石 1. 历史与定位 • 诞生&#xff1a;1993 年由 Ian…...

Dify X 奇墨科技,让AI大模型从“巨头专属”变为“触手可及”

AI大模型和AI Agent蓬勃发展&#xff0c;企业比拼的已不仅是AI技术储备&#xff0c;更是AI应用落地的实战能力。奇墨科技正式成为 AI 应用开发平台Dify中国大陆区企业版合作伙伴&#xff0c;帮助企业更便捷地接触到Dify并使用其开发AI应用。 Dify 是一款简单易用的 LLM 应用开…...

CSS相对定位与绝对定位

在网页设计里&#xff0c;相对定位&#xff08;Relative Positioning&#xff09;和绝对定位&#xff08;Absolute Positioning&#xff09;是 CSS&#xff08;层叠样式表&#xff09;里控制元素位置的关键手段。下面为你详细讲解它们的概念、特点与应用场景。 相对定位 概念…...

正则表达式(Regular Expression)详解

正则表达式&#xff08;简称"regex"或"regexp"&#xff09;是一种强大的文本模式匹配工具&#xff0c;它使用特定语法来描述、匹配和操作字符串。 基本概念 正则表达式是由普通字符&#xff08;如字母a到z&#xff09;和特殊字符&#xff08;称为"元…...

OpenCV-Python (官方)中文教程(部分一)_Day22

22.3 2D直方图 在前面的部分我们介绍了如何绘制一维直方图,之所以称为一维,是因为我们只考虑了图像的一个特征&#xff1a;灰度值。但是在 2D 直方图中我们就要考虑 两个图像特征。对于彩色图像的直方图通常情况下我们需要考虑每个的颜色&#xff08;Hue&#xff09;和饱和度&…...

【软考-高级】【信息系统项目管理师】【论文基础】采购管理过程输入输出及工具技术的使用方法

采购管理概念 项目采购管理包括从项目团队外部采购或获取所需产品、服务或成果的各个过程。项目采购管理包括编制和管理协议所需的管理和控制过程&#xff0c;例如合同、订购单、协议备忘录&#xff08;MOA&#xff09;和服务水平协议&#xff08;SLA&#xff09;。 采购管理…...

基于STM32、HAL库的CP2102-GMR USB转UART收发器 驱动程序设计

一、简介: CP2102-GMR是Silicon Labs公司生产的一款USB转UART桥接芯片,主要特点包括: 集成USB 2.0全速功能控制器 内置USB收发器,无需外部电阻 工作电压:3.0V至3.6V 支持的数据格式:数据位8,停止位1,无校验 最高支持1Mbps的波特率 内置512字节接收缓冲区和512字节发送…...

信息系统项目管理工程师备考计算类真题讲解十四

一、最小生成树问题 此问题采用破圈法来解决&#xff0c; 1&#xff09;以1节点为例&#xff0c;找到路径最小 点&#xff1a;1--5&#xff1a;距离为3 2&#xff09;找1--5最短的节点&#xff0c;选择4&#xff1a;1--5--4&#xff1a;距离为&#xff1a;5 3&#xff09;找…...

二叉树的基本操作

二叉树的基本操作(C 语言版) 1 二叉树的定义 二叉树的图长这样: 二叉树是每个结点最多有两个子树的树结构,常被用于实现二叉查找树和二叉堆。二叉树是链式存储结构,用的是二叉链,本质上是链表。二叉树通常以结构体的形式定义,如下,结构体内容包括三部分:本节点所存储…...

网络基础入门第6-7集(抓包技术)

前言&#xff1a; 来自小迪安全v2023 内容&#xff1a; 第六集&#xff1a; 大致内容&#xff1a;burpsuit、茶杯、fiddler的抓包流程 1、安装抓包软件的相关证书 2、各大抓包软件的测试 注意用burp抓模拟器的数据包&#xff0c;需要将ip地址设置为本地的ip地址&#xff…...