并发设计模式实战系列(7):Thread Local Storage (TLS)
🌟 大家好,我是摘星! 🌟
今天为大家带来的是并发设计模式实战系列,第七章Thread Local Storage (TLS),废话不多说直接开始~
目录
一、核心原理深度拆解
1. TLS内存模型
2. 关键特性
二、生活化类比:银行保险箱系统
三、Java代码实现(生产级Demo)
1. 基础用法示例
2. 高级用法:上下文传递
3. 内存泄漏防护方案
四、对比分析与应用场景
1. 线程数据管理方案对比
2. 典型应用场景
3. Java实现对比
五、高级特性与优化
1. InheritableThreadLocal穿透问题
2. Netty的FastThreadLocal优化
3. Spring的RequestContextHolder实现
六、TLS在分布式系统的扩展应用
1. 分布式上下文传播
2. 混合式TLS架构
七、性能优化深度实践
1. 消除伪共享优化
2. 对象池模式结合
3. JIT优化友好设计
八、TLS模式的反模式与陷阱
1. 典型误用案例
2. 线程池特殊问题
3. 类加载器泄漏
九、前沿技术演进
1. 虚拟线程(Loom)兼容性
2. GraalVM原生镜像支持
3. 响应式编程整合
十、行业最佳实践总结
1. 阿里规约推荐
2. Spring设计启示
3. 性能调优指标
一、核心原理深度拆解
1. TLS内存模型
┌───────────────────┐ ┌───────────────────┐
│ Thread 1 │ │ Thread 2 │
│ ┌─────────────┐ │ │ ┌─────────────┐ │
│ │ TLS Slot 1 │ │ │ │ TLS Slot 1 │ │
│ ├─────────────┤ │ │ ├─────────────┤ │
│ │ TLS Slot 2 │ │ │ │ TLS Slot 2 │ │
│ └─────────────┘ │ │ └─────────────┘ │
└───────────────────┘ └───────────────────┘
- 线程隔离存储:每个线程拥有独立的存储空间
- 隐式访问:通过线程ID自动路由到对应存储区域
- 生命周期绑定:与线程同生共死
2. 关键特性
- 零共享:彻底避免多线程竞争
- 快速访问:直接通过线程指针定位(现代JVM优化)
- 类型安全:Java泛型保证存储类型正确性
二、生活化类比:银行保险箱系统
系统组件 | 现实类比 | 核心行为 |
Thread | 银行客户 | 拥有独立的保险箱使用权 |
TLS | 保险箱系统 | 为每个客户分配独立存储空间 |
get()/set() | 存取操作 | 仅能操作自己的保险箱 |
- 安全机制:客户A无法访问客户B的保险箱(线程隔离)
- 便捷性:客户只需记住自己的钥匙(隐式线程ID关联)
三、Java代码实现(生产级Demo)
1. 基础用法示例
public class ThreadLocalDemo {// 创建ThreadLocal实例(支持泛型)private static final ThreadLocal<SimpleDateFormat> dateFormatHolder =ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd"));public static String formatDate(Date date) {// 每个线程获取自己独立的SimpleDateFormat实例return dateFormatHolder.get().format(date);}public static void main(String[] args) {ExecutorService pool = Executors.newFixedThreadPool(3);// 模拟多线程日期格式化for (int i = 0; i < 5; i++) {pool.execute(() -> {String result = formatDate(new Date());System.out.println(Thread.currentThread().getName() + " => " + result);});}pool.shutdown();}
}
2. 高级用法:上下文传递
class UserContextHolder {private static final ThreadLocal<User> holder = new ThreadLocal<>();public static void set(User user) {holder.set(user);}public static User get() {return holder.get();}public static void clear() {holder.remove(); // 防止内存泄漏}
}// 在Web过滤器中使用
class AuthFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {User user = authenticate((HttpServletRequest) request);UserContextHolder.set(user); // 设置当前线程用户try {chain.doFilter(request, response);} finally {UserContextHolder.clear(); // 必须清理!}}
}
3. 内存泄漏防护方案
// 方案1:继承InheritableThreadLocal实现自动清理
class SafeThreadLocal<T> extends InheritableThreadLocal<T> {@Overrideprotected void finalize() {super.remove(); // GC时主动清理}
}// 方案2:try-finally标准范式
void businessMethod() {try {threadLocal.set(someValue);// ...业务逻辑} finally {threadLocal.remove();}
}
四、对比分析与应用场景
1. 线程数据管理方案对比
方案 | 线程安全 | 性能 | 内存开销 | 适用场景 |
TLS | 完全安全 | 极高 | 中 | 线程独享对象 |
synchronized | 安全 | 低 | 低 | 少量共享资源 |
ConcurrentHashMap | 安全 | 高 | 高 | 全局共享缓存 |
volatile | 部分安全 | 中 | 低 | 状态标志 |
2. 典型应用场景
- 日期格式化:避免SimpleDateFormat线程不安全问题
- 数据库连接:某些ORM框架的Connection持有方式
- 用户会话:Web请求上下文传递(如Spring的RequestContextHolder)
- 事务管理:Spring的TransactionSynchronizationManager
- 性能优化:线程局部缓存(避免重复计算)
3. Java实现对比
实现类 | 继承特性 | 适用场景 |
ThreadLocal | 仅当前线程可见 | 普通线程局部变量 |
InheritableThreadLocal | 子线程可继承 | 线程池需要传递上下文 |
FastThreadLocal (Netty) | 优化版 | 高性能网络框架 |
五、高级特性与优化
1. InheritableThreadLocal穿透问题
// 线程池场景下默认会丢失继承关系
ExecutorService pool = Executors.newCachedThreadPool();
InheritableThreadLocal<String> itl = new InheritableThreadLocal<>();itl.set("parent-value");
pool.execute(() -> {// 可能获取不到值(线程复用)System.out.println(itl.get());
});// 解决方案:自定义线程工厂
class ContextAwareThreadFactory implements ThreadFactory {private final String context;public ContextAwareThreadFactory(String ctx) {this.context = ctx;}@Overridepublic Thread newThread(Runnable r) {return new Thread(() -> {itl.set(context);r.run();});}
}
2. Netty的FastThreadLocal优化
// 对比原生ThreadLocal的改进:
// 1. 使用数组代替哈希表(index预计算)
// 2. 消除哈希冲突处理开销
FastThreadLocal<String> ftl = new FastThreadLocal<>();
ftl.set("netty-optimized");
System.out.println(ftl.get());
3. Spring的RequestContextHolder实现
// 典型Web应用实现方式
class RequestContextFilter extends OncePerRequestFilter {@Overrideprotected void doFilterInternal(HttpServletRequest request,HttpServletResponse response, FilterChain filterChain) {// 绑定请求到当前线程RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request));try {filterChain.doFilter(request, response);} finally {// 清理线程状态RequestContextHolder.resetRequestAttributes();}}
}
六、TLS在分布式系统的扩展应用
1. 分布式上下文传播
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 服务A │ │ 服务B │ │ 服务C │
│ TLS上下文 │───>│ TLS上下文 │───>│ TLS上下文 │
│ (TraceID) │<───│ (TraceID) │<───│ (TraceID) │
└─────────────┘ └─────────────┘ └─────────────┘
- 跨服务传递:通过拦截器自动传播TLS中的TraceID、用户身份等信息
- 实现方案:
// 使用MDC(Mapped Diagnostic Context)实现
MDC.put("traceId", UUID.randomUUID().toString());
// 通过HTTP Header传播
restTemplate.interceptors.add((request, body, execution) -> {request.getHeaders().add("X-Trace-ID", MDC.get("traceId"));return execution.execute(request, body);
});
2. 混合式TLS架构
// 组合ThreadLocal和全局缓存
class HybridContext {private static final ConcurrentMap<Long, Context> GLOBAL = new ConcurrentHashMap<>();private static final ThreadLocal<Context> LOCAL = ThreadLocal.withInitial(() -> {Context ctx = new Context();GLOBAL.put(Thread.currentThread().getId(), ctx);return ctx;});public static Context get() {return LOCAL.get();}// 允许其他线程有限访问(需谨慎使用)public static Context get(long threadId) {return GLOBAL.get(threadId);}
}
七、性能优化深度实践
1. 消除伪共享优化
// 使用填充字节保证独立缓存行
class PaddedThreadLocal<T> extends ThreadLocal<T> {// 每个实例占用128字节(典型缓存行大小)public long p1, p2, p3, p4, p5, p6, p7 = 0L;@Overrideprotected T initialValue() {return null;}public long p8, p9, p10, p11, p12, p13, p14 = 0L;
}
2. 对象池模式结合
// 复用线程局部对象减少GC
class ObjectPool {private static final ThreadLocal<LinkedList<Resource>> pool = ThreadLocal.withInitial(() -> new LinkedList<>());public static Resource get() {LinkedList<Resource> list = pool.get();return list.isEmpty() ? new Resource() : list.removeLast();}public static void release(Resource obj) {obj.reset(); // 重置对象状态pool.get().add(obj);}
}
3. JIT优化友好设计
// 通过final修饰促进方法内联
public final class FastContext {private static final ThreadLocal<FastContext> INSTANCE = new ThreadLocal<>();// 内联友好的小方法public static FastContext get() {FastContext ctx = INSTANCE.get();if (ctx == null) {ctx = new FastContext();INSTANCE.set(ctx);}return ctx;}
}
八、TLS模式的反模式与陷阱
1. 典型误用案例
反模式 | 后果 | 正确做法 |
忘记remove() | 内存泄漏 | try-finally中清理 |
存储大对象 | 线程生命周期内存堆积 | 使用WeakReference |
跨线程传递可变对象 | 数据竞争 | 深度拷贝或不可变对象 |
2. 线程池特殊问题
ExecutorService pool = Executors.newFixedThreadPool(4);// 错误示例:线程复用导致上下文混乱
pool.execute(() -> {threadLocal.set("job1");// 可能被其他job复用
});// 正确方案:每次任务前初始化
pool.execute(() -> {try {threadLocal.set(Thread.currentThread().getName());// 业务逻辑} finally {threadLocal.remove();}
});
3. 类加载器泄漏
// 当ThreadLocal持有ClassLoader引用时
class PluginManager {static final ThreadLocal<ClassLoader> holder = new ThreadLocal<>();
}// 解决方案:使用WeakReference
static final ThreadLocal<WeakReference<ClassLoader>> holder = new ThreadLocal<>();
九、前沿技术演进
1. 虚拟线程(Loom)兼容性
// 虚拟线程下的TLS行为
Thread.Builder builder = Thread.ofVirtual().name("virtual-");
Thread t = builder.start(() -> {threadLocal.set("value"); // 与传统线程行为一致
});// 注意:虚拟线程更频繁创建/销毁,需加强内存泄漏防护
2. GraalVM原生镜像支持
# 需要在native-image配置中明确注册
--initialize-at-run-time=com.example.MyThreadLocalClass
3. 响应式编程整合
// 在Reactor上下文中的桥接
Mono.deferContextual(ctx -> {// 将TLS值注入响应式上下文String tlsValue = threadLocal.get();return Mono.just(tlsValue).contextWrite(Context.of("tls", tlsValue));
});
十、行业最佳实践总结
1. 阿里规约推荐
- 【强制】必须在线程内业务逻辑结束后调用remove()
- 【推荐】尽量使用static final修饰ThreadLocal实例
- 【参考】线程池场景使用InheritableThreadLocal需配合自定义ThreadFactory
2. Spring设计启示
// org.springframework.transaction.support.TransactionSynchronizationManager
private static final ThreadLocal<Map<Object, Object>> resources =new NamedThreadLocal<>("Transactional resources");// 关键设计:
// 1. 使用static final保证单例
// 2. NamedThreadLocal便于诊断
// 3. 完善的clear()机制
3. 性能调优指标
监控指标 | 健康阈值 | 工具获取方式 |
ThreadLocal实例数 | < 线程数×2 | JConsole MBean监控 |
未清理的TLS内存占比 | < 0.1%堆内存 | MemoryAnalyzer工具分析 |
TLS访问耗时 | < 50ns/次 | JMH基准测试 |
相关文章:
并发设计模式实战系列(7):Thread Local Storage (TLS)
🌟 大家好,我是摘星! 🌟 今天为大家带来的是并发设计模式实战系列,第七章Thread Local Storage (TLS),废话不多说直接开始~ 目录 一、核心原理深度拆解 1. TLS内存模型 2. 关键特性 二、生活化类比&a…...
本地使用Ollama部署DeepSeek
以下是在本地使用Ollama部署DeepSeek的详细教程,涵盖安装、修改安装目录、安装大模型以及删除大模型的操作步骤。 安装Ollama 1. 系统要求 确保你的系统满足以下条件: 操作系统:macOS、Linux或者Windows。足够的磁盘空间和内存。 2. 安装…...
通过VSCode远程连接到CentOS7/Ubuntu18等老系统
通过VSCode远程连接到CentOS7/Ubuntu18等老系统 背景 VSCode的远程连接插件Remote SSH一直以来是简单好用的远程工具。然而,2025年2月之后的版本在远程安装vscode-server时,预编译的server依赖glibc 2.28,这就要求Linux远程机的glibc版本应…...
Python在AI虚拟教学视频开发中的核心技术与前景展望
Python在AI虚拟教学视频开发中的核心技术与前景展望 一、引言:AI虚拟教学的技术革新 随着教育数字化转型加速,AI虚拟教学视频凭借个性化、沉浸式体验成为教育科技的新风口。Python以其强大的多模态处理能力、丰富的开源生态和跨领域兼容性,成…...
【金仓数据库征文】金仓数据库:开启未来技术脑洞,探索数据库无限可能
我的个人主页 我的专栏: 人工智能领域、java-数据结构、Javase、C语言,希望能帮助到大家!!! 点赞👍收藏❤ 目录 引言:数据库进化的下一站 —— 未来科技的无限可能金仓数据库简介:国…...
深入掌握Redis主从复制:原理、配置与生产级实践指南
一、主从复制核心价值与适用场景 1.1 核心价值矩阵 数据安全:多节点冗余存储,避免单点数据丢失 服务可用性:主节点故障时可快速切换从节点 性能扩展:通过横向扩展从节点提升读吞吐量 运维便利:从节点可承担备份、分…...
springboot如何管理多数据源?
静态多数据源管理 配置多个数据源 :创建多个数据源的配置类,通常使用 @ConfigurationProperties 注解来绑定配置文件中的数据源属性,并通过 @Bean 注解定义多个 DataSource Bean 。例如: 配置类: @Configuration public class DataSourceConfig {@Bean(name = "prima…...
基于风力推进器控制的小球实验装置设计与研究
目录 完整论文下载链接放在文章结尾,有需要自行下载。 目录 摘 要 1 引 言 2 概述 2.1 风控小球系统概述 2.2 本设计方案思路 2.3 研发方向和技术关键 2.4 主要技术指标 3 总体设计 4 硬件设计 4.1 单片机最小系统 4.2 供电接口电路 4.3 Openmv摄像头…...
Swift闭包(Closure)深入解析与底层原理
前言 在Swift开发中,闭包是一个非常重要且强大的特性。本文将深入探讨Swift闭包的底层实现原理,帮助开发者更好地理解和使用这一特性。 1. 什么是闭包 闭包是自包含的函数代码块,可以在代码中被传递和使用。它不仅可以像函数一样执行代码&…...
【DE-III】基于细节增强的模态内和模态间交互的视听情感识别
abstract 在视听情感识别(AVER)中,捕捉视频和音频模态之间复杂的时间关系是至关重要的。然而,现有的方法缺乏对局部细节的关注,如视频帧之间的面部状态变化,这会降低特征的可区分性,从而降低识别准确率。 为此,本文提出了一种用于AVER的细节增强的模态内和模态间交互…...
c++11 :智能指针
目录 一 为什么需要智能指针? 二 智能指针的使用及原理 1. RAII 2. auto_ptr 3. unique_ptr 4. shared_ptr 5. weak_ptr 三 内存泄漏 1.什么是内存泄漏,内存泄漏的危害 2. 如何避免内存泄漏? 一 为什么需要智能指针? …...
Linux解压tar.gz包的正确姿势(附赠防抓狂指南)
一、为什么你的解压命令总报错? 每次看到.tar.gz后缀是不是心里一紧?(别装了!我都看到你偷偷打开浏览器查命令的样子了)这个在Linux界横行霸道的压缩格式,其实用对了方法比Windows的zip还简单。今天咱们不…...
MCP协议:让AI从“话痨”变“实干家”的神奇魔法
一、MCP 协议:AI 界的 “万能插头” 是啥来头? 1.1 从 “动口不动手” 到 “全能打工人” 你以为 AI 只会陪你聊天、写文案?那你可小瞧它啦!MCP 协议(Model Context Protocol),堪称 AI 的 “瑞…...
如何在SpringBoot中通过@Value注入Map和List并使用YAML配置?
在SpringBoot开发中,我们经常需要从配置文件中读取各种参数。对于简单的字符串或数值,直接使用Value注解就可以了。但当我们需要注入更复杂的数据结构,比如Map或者List时,该怎么操作呢?特别是使用YAML这种更人性化的配…...
记一次调用大华抓拍SDK并发优化
目录 一、问题分析 二、解决思路 三、贴代码 四、总结 一、问题分析 按惯例上问题: 设备告警采用高电平持续模式:一次开,不主动关就一直处于告警状态。 并发时多个请求下发 setDVRAlarmOutConfig,导致状态混乱。 “开 -&g…...
打破认知!没论文没竞赛,我的暑期实习上岸秘籍:简历要敢 “吹”,面试靠巧 “聊”
前言 以下教程仅针对本人的大大小小几十场暑期实习面试的经验总结,个人背景(双9,无论文、无竞赛、无大厂实习、无奖。)。简历几易其稿,相对于原来的初版,可谓是脱胎换骨,洗经易髓。 二月中旬开…...
为何 RAG 向量存储应优先考虑 PostgreSQL + pgvector 而非 MySQL?
构建检索增强生成(RAG)系统已成为释放大型语言模型(LLM)潜力的关键范式。通过将 LLM 的推理能力与外部知识库的实时、特定信息相结合,RAG 能够生成更准确、更相关、更值得信赖的回答。而这个“外部知识库”的核心&…...
LangChain LCEL表达式语言简介
LangChain表达式语言(LCEL)是专为构建AI应用链设计的声明式编程框架,通过管道符|实现组件无缝衔接,支持流式处理、异步调用等生产级特性。其核心优势在于零代码改动实现原型到生产的过渡,同时保持代码简洁性和可维护性…...
智能座舱背后的秘密:智能座舱测试如何“具身智能”
在上期文章《智能座舱背后的秘密:AI赋能测试如何改写驾乘体验》中,我们聊到了“智能座舱”已成为车企争夺用户心智的核心战场、智能座舱功能体验进化、AI赋能座舱测试将突破“场景覆盖、情感量化、角色/场景衍生”技术实现方面的三大困局,并在…...
鸿蒙-试一下属性字符串:除了Span之外,如何在同一个Text组件中展示不同样式的文字
文章目录 前言简介有哪些类型拉出来溜溜Text SpanStyledString其他CustomSpan先看一下构造函数onMeasure(measureInfo: CustomSpanMeasureInfo): CustomSpanMetricsonDraw(context: DrawContext, drawInfo: CustomSpanDrawInfo) 遗留问题 前言 在开发中,经常会遇到…...
今日最新漂亮的早上好图片祝福,最真的牵挂,永远的祝福
1、清晨的一个问候给你一个新的心情、一个祝福带给你新的起点、一个关心带给你一个新的愿望。祝福你心中常有快乐涌现!早安! 2、人过花甲万事休,唯有健康不可丢,荣华富贵皆浮云,逍遥自在渡岁月!时光匆匆&am…...
MySQL 库的操作 -- 增删改查,备份和恢复,系统编码
文章目录 库的操作增删改查数据库的查看和创建查看当前位于哪个数据库中数据库的删除总结显示数据库的创建语句修改数据库 认识系统编码数据库的编码问题查看系统默认的字符集和效验规则校验规则对数据库的影响 数据库的备份和恢复备份还原备份的是一张表 查看数据库的连接情况…...
【c++11】c++11新特性(下)(可变参数模板、default和delete、容器新设定、包装器)
🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:C 目录 前言 五、可变参数模板 1. 概念及简单定义 2. 包扩展 六、 default和delete 七、容器新设定 1. 新容器 2. 新接口 emplace系列接口 八、函数包…...
fps项目总结:生成武器子弹
文章目录 spawn actor:生成武器固定生成:因为武器的碰撞设为noCollision attach actor to component:将武器附加到骨骼上,成为mesh的子组件对齐到目标:对齐到插槽 子弹阻挡的前提是根组件为碰撞体子弹对碰撞体全是阻挡…...
大模型备案对模型训练语料的要求
昨天接到一位客户的咨询,说他们的模型还在开发阶段,想提前了解一下大模型备案政策中对于模型训练语料有什么具体要求,提前规避一下。客户确实有前瞻性,考虑得比较充分。训练语料在研发阶段至关重要,直接影响模型的性能…...
Ethan独立开发产品日报 | 2025-04-24
1. Peek AI个人财务教练,帮助你做出决策。 Peek的人工智能助手提供主动的跟踪服务——它会分析你的消费习惯,并以细腻而积极的方式帮助你调整这些习惯。没有评判,也没有负担。就像是为你的财务量身定制的Spotify Wrapped,完美贴…...
egg环境搭建
前言 egg.js 是由阿里开源的面向企业级开发的 Node.js 服务端框架,它的底层是由 Koa2 搭建。 Github:https://github.com/eggjs/egg,目前 14.8K Star,egg 很适合做中台。 安装 首先,你要 确保 Node 已经配置环境变量…...
Linux的基础指令
目录 1、Shell及运行原理 2、热键 3、Linux的基础知识 4、Linux的基础指令 4.1 man 4.2 clear&&history&&whoami 4.3 pwd 4.4 ls 4.5 cd 4.6 mkdir&&touch 1. mkdir 2. touch 4.7 rmdir&&rm 1. rmdir 2. rm 4.8 cp&&mv…...
第一部分:git基本操作
目录 1、git初识 1.1、存在的问题 1.2、版本控制器 1.3、git安装 1.3.1、CentOS平台 1.3.2、ubuntu平台 2、git基本操作 2.1、创建仓库 2.2、配置git 3、工作区、暂存区、版本库 4、基本操作 4.1、场景一 4.2、场景二 4.3、修改文件 5、版本回退 6、撤销修改 …...
Kafka和其他组件的整合
Kafka和其他组件的整合 1.Kafka和Flume的整合 需求1:利用flume监控某目录中新生成的文件,将监控到的变更数据发送给kafka,kafka将收到的数据打印到控制台: 在flume/conf下添加.conf文件, vi flume-kafka.conf # 定…...
学习AI必知的20大概念
🎯AI开发者必知的20大概念 🤖 机器学习:基础算法和模型训练。 🧠 深度学习:复杂表示学习。 🌐 神经网络:非线性关系建模。 🗣️ NLP:文本处理和理解。 👁️…...
VRRP与防火墙双机热备实验
目录 实验一:VRRP负载均衡与故障切换 实验拓扑编辑一、实验配置步骤 1. 基础网络配置 2. VRRP双组配置 二、关键验证命令 1. 查看VRRP状态 2. 路由表验证 三、流量分析 正常负载均衡场景: 故障切换验证: 实验二:防火…...
【金仓数据库征文】——选择金仓,选择胜利
目录 第一部分:金仓数据库——开创数据库技术的新时代 1.1 金仓数据库的技术底蕴 1.2 高可用架构与灾备能力 1.3 分布式架构与弹性扩展能力 第二部分:金仓数据库助力行业数字化转型 2.1 电信行业:核心系统国产化替代 2.2 医疗行业&…...
微软官网Win10镜像下载快速获取ISO文件
如何从微软官网轻松下载win10镜像?win10镜像的下载方式主要包括两种: 目录 一:借助官方工具 二:直接微软官网通过浏览器进行下载。 三:实现方法与步骤: 1:利用微软官方提供的MediaCreationT…...
发放优惠券
文章目录 概要整体架构流程技术细节小结 概要 发放优惠券 处于暂停状态,或者待发放状态的优惠券,在优惠券列表中才会出现发放按钮,可以被发放: 需求分析以及接口设计 需要我们选择发放方式,使用期限。 发放方式分…...
【专题刷题】二分查找(二)
📝前言说明: 本专栏主要记录本人的基础算法学习以及LeetCode刷题记录,按专题划分每题主要记录:(1)本人解法 本人屎山代码;(2)优质解法 优质代码;ÿ…...
如何避免IDEA每次打开新项目都重复配置Maven?
每次打开新项目都要重新设置Maven路径?每次导入工程都要手动调整settings.xml?如果你也受够了IDEA这种“健忘”行为,那么这篇文章就是为你准备的!今天我们就来彻底解决这个问题,让IDEA记住你的Maven配置,一…...
【Linux网络编程】应用层协议HTTP(实现一个简单的http服务)
目录 前言 一,HTTP协议 1,认识URL 2,urlencode和urldecode 3,HTTP协议请求与响应格式 二,myhttp服务器端代码的编写 HTTP请求报文示例 HTTP应答报文示例 代码编写 网络通信模块 处理请求和发送应答模块 结…...
深度解析之算法之分治(快排)
44.颜色分类 题目链接 给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地 对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。 我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。 必须在不使用库内置…...
【金仓数据库征文】-金仓数据库性能调优 “快准稳” 攻略:实战优化,让数据处理飞起来
我的个人主页 我的专栏: 人工智能领域、java-数据结构、Javase、C语言,希望能帮助到大家!!! 点赞👍收藏❤ 目录 一、KingbaseES金仓数据库简介二、快速入门:金仓数据库下载与安装指南三、“快”…...
DPIN河内AI+DePIN峰会:共绘蓝图,加速构建去中心化AI基础设施新生态
近日,一场聚焦前沿科技融合的盛会——AIDePIN峰会在越南河内成功举办。此次峰会由DPIN、QPIN及42DAO等Web3领域的创新项目联合组织,汇聚了众多Web3行业领袖、技术专家与社区成员。峰会于2025年4月19日举行,其核心议题围绕去中心化物理基础设施…...
vscode和git 踩坑
git init经常 在 vscode push错误问题: 正确姿势:先 GitHub 上建仓库 → git clone 拉到本地 → 再用 VSCode 打开编辑 ❌ 不是:VSCode 里 git init → 再去 GitHub 选个仓库绑定 举个对比 操作流程是否推荐后果GitHub 创建仓库 → git clone → 用 VSC…...
C++11介绍
目录 一、C11的两个小点 1.1、decltype 1.2、nullptr 二、列表初始化 2.1、C98传统的{} 2.2、C11中的{} 2.3、C11中的std::initializer_list 三、右值引用和移动语义 3.1、左值和右值 3.2、左值引用和右值引用 3.3、引用延长生命周期 3.4、左值和右值的参数匹配 3…...
AI数字人:繁荣背后的伦理困境与法律迷局(8/10)
摘要:本文深入剖析 AI 数字人从虚拟走向现实的历程,阐述其融合多技术实现从静态到动态交互的跨越,爆发式应用于各领域带来的商业价值与社会影响,同时直面由此引发的伦理法律挑战,包括身份认同、数据隐私、责任归属及权…...
SOLID 原则在单片机环境下的 C 语言实现示例,结合嵌入式开发常见场景进行详细说明
1. 单一职责原则 (SRP) 定义:一个模块(函数/文件)只负责一个功能。 示例:传感器数据采集与处理分离 // SensorAdc.h - 仅负责ADC原始数据采集 typedef struct { uint16_t (*ReadRaw)(void); // 原始数据读取接口 } SensorAdc; // SensorProcessor.h - 仅负责数据处理…...
RT Thread 发生异常时打印输出cpu寄存器信息和栈数据
打印输出发生hardfault时,当前栈十六进制数据和cpu寄存器信息 在发生 HardFault 时,打印当前栈的十六进制数据和 CPU 寄存器信息是非常重要的调试手段。以下是如何实现这一功能的具体步骤和示例代码。 1. 实现 HardFault 处理函数 我们需要在 HardFault 中捕获异常上下文,…...
SQL 函数进行左边自动补位fnPadLeft和FORMAT
目录 1.问题 2.解决 方式1 方式2 3.结果 1.问题 例如在SQL存储过程中,将1 或10 或 100 长度不足的时候,自动补足长度。 例如 1 → 001 10→ 010 100→100 2.解决 方式1 SELECT FORMAT (1, 000) AS FormattedNum; SELECT FORMAT(12, 000) AS Form…...
Unity中数据和资源加密(异或加密,AES加密,MD5加密)
在项目开发中,始终会涉及到的一个问题,就是信息安全,在调用接口,或者加载的资源,都会涉及安全问题,因此就出现了各种各样的加密方式。 常见的也是目前用的最广的加密方式,分别是:DES、3DES、AES、MD5、XOR(异或) 其中DES、3DES、AES、MD5用在数据加密中偏多,特别是…...
C++初窥门径
const关键字 一、const关键字 修饰成员变量 常成员变量:必须通过构造函数的初始化列表进行初始化,且初始化后不可修改。 示例: class Student { private: const int age; // 常成员变量 public: Student(string name, int age) : age(ag…...
Spring知识点总结
目录 1.什么是spring?你对spring的理解? 2.spring的优缺点? 3.解释一下IOC和AOP? 4.IOC和DI的区别? 5.spring中管理对象注入的方式? 6.自动注入的注解有哪些? 声明bean的注解 Bean的生命…...