如何制作表白小程序seo的作用是什么

张小明 2026/1/9 16:23:54
如何制作表白小程序,seo的作用是什么,深网站建设,关键词是指什么目录前言1. 基本知识2. 父子线程数据不同3. 父子线程数据相同前言 Java基本知识#xff1a; java框架 零基础从入门到精通的学习路线 附开源项目面经等#xff08;超全#xff09;【Java项目】实战CRUD的功能整理#xff08;持续更新#xff09; 1. 基本知识 本意大概…目录前言1. 基本知识2. 父子线程数据不同3. 父子线程数据相同前言Java基本知识java框架 零基础从入门到精通的学习路线 附开源项目面经等超全【Java项目】实战CRUD的功能整理持续更新1. 基本知识本意大概如下基于 ThreadLocal 的请求级校验上下文容器ValidatorDataContext这是自定义的用于在同一个请求线程内共享和传递校验/业务相关数据。它继承自ConcurrentHashMapString, Object本质上是一个线程安全的 Key-Value 上下文但通过 ThreadLocal 绑定到当前线程从而保证每个请求线程拥有独立的数据副本互不干扰整体设计目的是在校验Validator或业务处理链路中作为一个与请求生命周期一致的上下文数据容器方便不同校验器或组件在不显式传参的情况下共享数据同时保证线程安全与请求隔离。**线程池上下文Thread Pool Context**指的是在任务提交线程中已有的一些“隐式状态”如何在被线程池复用的工作线程中继续可用“隐式状态”通常包括登录用户信息userId、token请求信息requestId、traceId租户信息tenantId语言/区域Locale安全上下文SecurityContext日志链路MDC / Trace数据源路由信息事务标记⚠️线程池上下文的Demo如下:1️⃣ ThreadLocal 的设计前提ThreadLocal 的核心假设是一个请求 一个线程但在线程池中线程是 复用的一个线程会执行 多个不同请求的任务➡️ 导致两个问题❌ 问题一上下文丢失ThreadLocal.set(userA);executor.submit(()-{// 这里读不到 userA});原因任务在线程池的另一个线程执行❌ 问题二上下文污染更危险ThreadLocal.set(userA);executor.submit(()-{// 执行完后没清理});executor.submit(()-{// 读到的是 userA脏数据});原因线程池线程被复用上一个任务的 ThreadLocal 没清线程池的上下文Demopackage线程池上下文;importlombok.Data;importjava.util.concurrent.ConcurrentHashMap;DatapublicclassValidatorDataContextextendsConcurrentHashMapString,Object{/** * * 请求对象 */publicObjectrequestDto;publicObjectput(Stringkey,Objectvalue){if(keynull||valuenull){returnnull;}else{returnsuper.put(key,value);}}/** * * ValidatorContext为请求上下文与当前请求线程绑定继承自ConcurrentHashMap */publicstaticfinalThreadLocal?extendsValidatorDataContextthreadLocalThreadLocal.withInitial(()-newValidatorDataContext());/** * * 获取当前线程的上下文 * * return */publicstaticValidatorDataContextgetCurrentContext(){ValidatorDataContextcontextthreadLocal.get();returncontext;}/** * * 设值 * * param key * param value */publicvoidset(Stringkey,Objectvalue){if(value!null){put(key,value);}else{remove(key);}}/** * 设置值 * param clazz 会自动取SimpleName为Key * param value * author K * 2020年10月12日下午6:38:01 */publicvoidsetByClass(Classclazz,Objectvalue){Stringkeyclazz.getSimpleName();set(key,value);}/** * * 获取String值 * * param key * return */publicStringgetString(Stringkey){return(String)get(key);}/**其他类型的值同理进行强转换*//** * * 获取对象 * * param T * return */publicTTgetByClazz(ClassTclazz){if(get(clazz.getSimpleName())null){returnnull;}else{return(T)get(clazz.getSimpleName());}}publicTTgetRequestDto(ClassTclazz){returnclazz.cast(requestDto);// 强制类型转换更安全}publicvoidsetRequestDto(ObjectrequestDto){this.requestDtorequestDto;}}2. 父子线程数据不同子线程不会拷贝父线程的数据package线程池上下文;importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;importjava.util.concurrent.TimeUnit;// 模拟一个业务对象classUser{privateStringname;privateintage;publicUser(Stringname,intage){this.namename;this.ageage;}publicStringgetName(){returnname;}publicintgetAge(){returnage;}}publicclassValidatorDataContextDemo{publicstaticvoidmain(String[]args)throwsInterruptedException{// 创建线程池ExecutorServiceexecutorExecutors.newFixedThreadPool(2);// 主线程设置上下文 ValidatorDataContextcontextValidatorDataContext.getCurrentContext();context.set(traceId,TRACE-20251225-001);context.setRequestDto(newUser(Alice,30));context.setByClass(User.class,newUser(Bob,25));System.out.println(主线程 - traceId: context.getString(traceId));System.out.println(主线程 - RequestDto name: context.getRequestDto(User.class).getName());System.out.println(主线程 - User class value name: context.getByClazz(User.class).getName());// 在线程池中访问上下文 executor.submit(()-{// 注意ThreadLocal 是线程隔离的所以线程池线程无法直接获取主线程上下文ValidatorDataContextthreadContextValidatorDataContext.getCurrentContext();System.out.println(\n子线程1 - traceId: threadContext.getString(traceId));// nullSystem.out.println(子线程1 - RequestDto: threadContext.getRequestDto());// null// 可以在子线程独立设置threadContext.set(traceId,THREAD-TRACE-001);System.out.println(子线程1 - 新 traceId: threadContext.getString(traceId));});executor.submit(()-{ValidatorDataContextthreadContextValidatorDataContext.getCurrentContext();System.out.println(\n子线程2 - traceId: threadContext.getString(traceId));// null});// 等待线程执行完executor.shutdown();executor.awaitTermination(5,TimeUnit.SECONDS);// 主线程上下文依然可用 System.out.println(\n主线程 - traceId 再次访问: context.getString(traceId));}}截图如下3. 父子线程数据相同在大的Demo下增加如下:// 克隆当前上下文publicValidatorDataContextcopy(){ValidatorDataContextcopynewValidatorDataContext();copy.putAll(this);copy.requestDtothis.requestDto;returncopy;}总体的Demo测试如下:package线程池上下文;importjava.util.concurrent.*;// 包装 Runnable传递上下文classContextAwareRunnableimplementsRunnable{privatefinalRunnabletask;privatefinalValidatorDataContextcapturedContext;publicContextAwareRunnable(Runnabletask,ValidatorDataContextcontext){this.tasktask;this.capturedContextcontext.copy();// 拷贝上下文}Overridepublicvoidrun(){ValidatorDataContextpreviousValidatorDataContext.getCurrentContext();try{// 设置当前线程上下文为捕获的上下文ValidatorDataContext.threadLocal.set(capturedContext);task.run();}finally{// 执行完毕恢复或清理上下文ValidatorDataContext.threadLocal.set(previous);}}}// 主类 DemopublicclassValidatorDataContextWithThreadPoolDemo{// 辅助方法包装 RunnableprivatestaticRunnablewrap(Runnabletask){returnnewContextAwareRunnable(task,ValidatorDataContext.getCurrentContext());}publicstaticvoidmain(String[]args)throwsInterruptedException,ExecutionException{ExecutorServiceexecutorExecutors.newFixedThreadPool(2);// 主线程设置上下文ValidatorDataContextcontextValidatorDataContext.getCurrentContext();context.set(traceId,TRACE-20251225-001);context.setRequestDto(newUser(Alice,30));context.setByClass(User.class,newUser(Bob,25));System.out.println(主线程 - traceId: context.getString(traceId));System.out.println(主线程 - RequestDto name: context.getRequestDto(User.class).getName());System.out.println(主线程 - User class value name: context.getByClazz(User.class).getName());// 提交线程池任务自动继承主线程上下文Future?future1executor.submit(wrap(()-{ValidatorDataContextthreadContextValidatorDataContext.getCurrentContext();System.out.println(\n子线程1 - traceId: threadContext.getString(traceId));System.out.println(子线程1 - RequestDto name: threadContext.getRequestDto(User.class).getName());System.out.println(子线程1 - User class value name: threadContext.getByClazz(User.class).getName());// 修改上下文不会影响主线程threadContext.set(traceId,THREAD-TRACE-001);}));Future?future2executor.submit(wrap(()-{ValidatorDataContextthreadContextValidatorDataContext.getCurrentContext();System.out.println(\n子线程2 - traceId: threadContext.getString(traceId));}));// 等待执行完成future1.get();future2.get();// 主线程上下文仍然保持原值System.out.println(\n主线程 - traceId 再次访问: context.getString(traceId));executor.shutdown();executor.awaitTermination(5,TimeUnit.SECONDS);}}截图如下
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

把网站内容东西打出来怎么做网站防恶意注册

企业级大模型应用开发实战指南:从零到规模化部署 【免费下载链接】llm-universe 项目地址: https://gitcode.com/GitHub_Trending/ll/llm-universe 在当前人工智能技术快速发展的背景下,大语言模型已成为企业数字化转型的重要工具。然而&#xf…

张小明 2026/1/6 20:46:47 网站建设

怎么做招投标网站网站正在建设中提示页面设计欣赏

第一章:Open-AutoGLM封装技术概述Open-AutoGLM 是一种面向大语言模型(LLM)应用开发的轻量级封装框架,旨在简化模型调用、提示工程与响应解析的集成流程。该技术通过统一接口抽象底层模型差异,使开发者能够以声明式方式…

张小明 2026/1/6 14:51:59 网站建设

怎么创造一个网站建设银行网站解除绑定

LOOT模组排序工具:新手也能轻松解决天际模组冲突 【免费下载链接】skyrimse The TES V: Skyrim Special Edition masterlist. 项目地址: https://gitcode.com/gh_mirrors/sk/skyrimse 对于《上古卷轴V:天际 特别版》的模组爱好者来说,…

张小明 2026/1/7 2:32:39 网站建设

网站如何做原创文章wordpress sha256

深入探索Windows Communication Foundation开发实践 在Windows Communication Foundation(WCF)的开发中,有许多实用的技巧和方法可以帮助我们构建高效、灵活的服务。下面将详细介绍几个重要的练习内容。 练习2:附加和访问主机扩展 本练习主要包括两个主要任务:创建主机…

张小明 2026/1/7 1:02:31 网站建设

四川省建设厅的注册中心网站首页wordpress添加中文语言

FaceFusion在直播带货中的潜在应用价值探讨技术背景与行业趋势当一场直播的GMV轻松突破亿元大关,而主播却从未真正“出镜”——这已不再是科幻情节。在2023年双十一大促中,某国货美妆品牌启用AI复刻的“虚拟李佳琦”连续直播18小时,带动单品销…

张小明 2026/1/6 19:12:38 网站建设