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

.net怎么做网站html5网站制作培训

.net怎么做网站,html5网站制作培训,营销网站建设公司有哪些,淄博做网站seoThreadLocal、InheritableThreadLocal、TransmittableThreadLocal 详解与使用场景 1. ThreadLocal 核心功能: ThreadLocal 提供线程隔离的变量存储,每个线程独立访问自己的变量副本,互不干扰。 特点: 线程隔离:每个线…

ThreadLocal、InheritableThreadLocal、TransmittableThreadLocal 详解与使用场景


1. ThreadLocal

核心功能
ThreadLocal 提供线程隔离的变量存储,每个线程独立访问自己的变量副本,互不干扰。
特点

  • 线程隔离:每个线程拥有独立的变量副本。
  • 生命周期:变量生命周期与线程一致,线程结束时变量被回收。
  • 不支持跨线程传递:子线程无法继承父线程的值。

使用场景

  • 线程内状态管理:例如存储用户登录信息、事务 ID、请求上下文等。
  • 避免参数传递:在分层架构中,避免显式传递上下文参数(如 Web 请求中的用户信息)。

示例代码

public class UserContextHolder {private static final ThreadLocal<User> userThreadLocal = new ThreadLocal<>();public static void setUser(User user) {userThreadLocal.set(user);}public static User getUser() {return userThreadLocal.get();}public static void removeUser() {userThreadLocal.remove(); // 避免内存泄漏}
}// 在线程中使用
public class MyRunnable implements Runnable {@Overridepublic void run() {User user = new User("User-" + Thread.currentThread().getName());UserContextHolder.setUser(user);System.out.println("当前线程:" + Thread.currentThread().getName() + ",用户:" + UserContextHolder.getUser().getName());UserContextHolder.removeUser(); // 清理资源}
}

局限性

  • 不支持跨线程传递:如果子线程需要访问父线程的值,需手动传递。
  • 线程池复用问题:线程池中线程被复用时,旧线程的 ThreadLocal 值可能残留,导致数据污染。

2. InheritableThreadLocal

核心功能
InheritableThreadLocalThreadLocal 的子类,支持子线程继承父线程的值。
特点

  • 继承性:子线程自动继承父线程的值(仅限新建线程,不支持线程池复用)。
  • 生命周期:与线程生命周期一致,线程结束后变量被回收。
  • 不支持线程池:线程池中的线程复用会导致子线程继承旧值,引发数据污染。

使用场景

  • 父子线程传递上下文:例如主线程设置 Trace ID,子线程自动继承用于日志追踪。
  • 简单异步任务:子线程需要访问父线程的上下文信息。

示例代码

public class TraceContext {private static final InheritableThreadLocal<String> traceId = new InheritableThreadLocal<>();public static void setTraceId(String id) {traceId.set(id);}public static String getTraceId() {return traceId.get();}public static void removeTraceId() {traceId.remove();}
}// 主线程设置 Trace ID
public class Main {public static void main(String[] args) {TraceContext.setTraceId("123456");new Thread(() -> {System.out.println("子线程 Trace ID: " + TraceContext.getTraceId()); // 输出 "123456"}).start();TraceContext.removeTraceId(); // 清理资源}
}

局限性

  • 线程池不兼容:线程池中的线程被复用时,子线程会继承旧值,导致数据污染。
  • 继承值不可变:父线程修改值后,子线程的值不会更新。

3. TransmittableThreadLocal

核心功能
TransmittableThreadLocal(TTL)是阿里巴巴开源的工具类,解决 ThreadLocalInheritableThreadLocal 在线程池等场景下的局限性。
特点

  • 支持跨线程传递:支持线程池、异步任务等场景中传递上下文。
  • 兼容性:兼容 ThreadLocal API,可直接替换使用。
  • 自动清理机制:减少内存泄漏风险。

使用场景

  • 线程池场景:例如 Feign、Dubbo 调用链路追踪、异步任务上下文传递。
  • 分布式系统:跨服务调用时传递 Trace ID、用户信息等。

示例代码

import com.alibaba.ttl.TransmittableThreadLocal;public class TraceContext {public static final TransmittableThreadLocal<String> TRACE_ID = new TransmittableThreadLocal<>();public static void setTraceId(String id) {TRACE_ID.set(id);}public static String getTraceId() {return TRACE_ID.get();}public static void removeTraceId() {TRACE_ID.remove();}
}// 结合线程池使用
import com.alibaba.ttl.TtlExecutors;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class Main {public static void main(String[] args) {ExecutorService executor = TtlExecutors.getTtlExecutorService(Executors.newFixedThreadPool(2));TraceContext.setTraceId("123456");executor.submit(TtlRunnable.get(() -> {System.out.println("线程池任务 Trace ID: " + TraceContext.getTraceId()); // 输出 "123456"}));TraceContext.removeTraceId(); // 清理资源}
}

优势

  • 线程池兼容:通过 TtlRunnable/TtlCallableWrapper 包装任务,确保上下文正确传递。
  • 支持异步任务:适用于 Spring @Async、CompletableFuture 等异步编程场景。

三者对比总结

特性ThreadLocalInheritableThreadLocalTransmittableThreadLocal (TTL)
线程隔离
支持跨线程传递✅(仅限新建线程)✅(支持线程池、异步任务)
线程池兼容性❌(数据污染风险)❌(数据污染风险)✅(通过 TtlRunnable 包装)
性能开销⭐ 最低⭐⭐ 略高⭐⭐⭐ 较高
适用场景线程内状态管理父子线程传递线程池、异步任务、分布式系统

选择建议

  1. 简单线程内隔离:使用 ThreadLocal(如 Web 请求中的用户信息)。
  2. 父子线程传递:使用 InheritableThreadLocal(如主线程向子线程传递 Trace ID)。
  3. 线程池或异步任务:使用 TransmittableThreadLocal(如 Feign 调用链路追踪)。

注意事项

  1. 资源清理:无论使用哪种工具,务必在任务结束后调用 remove(),避免内存泄漏。
  2. 线程池适配:使用 TtlExecutors 包装线程池,确保 TTL 正常工作。
  3. 避免过度使用:仅在需要跨线程传递的变量上使用 TTL,避免全量替换 ThreadLocal

通过合理选择工具,可以高效管理多线程环境中的上下文传递问题。


文章转载自:

http://mmrpcuVR.qfLwp.cn
http://5hd6Wbdy.qfLwp.cn
http://nRnZMZ6o.qfLwp.cn
http://dBTEEvFK.qfLwp.cn
http://WlKa6uKg.qfLwp.cn
http://dbrCh1e1.qfLwp.cn
http://9fCF2hVs.qfLwp.cn
http://vviicLDe.qfLwp.cn
http://LuJzCBh5.qfLwp.cn
http://nMibXFDy.qfLwp.cn
http://dzEvx9Bu.qfLwp.cn
http://580SR2RF.qfLwp.cn
http://uLQiLlco.qfLwp.cn
http://bHoVB5sl.qfLwp.cn
http://ANtyCipU.qfLwp.cn
http://fOD4TQNy.qfLwp.cn
http://F7uZzAG3.qfLwp.cn
http://f66Xdx6t.qfLwp.cn
http://IcYsvDSe.qfLwp.cn
http://s8qkEqLR.qfLwp.cn
http://gUqV0OQc.qfLwp.cn
http://4HpjwNac.qfLwp.cn
http://yecFsoXd.qfLwp.cn
http://ry9iDwLT.qfLwp.cn
http://l0f1eN2P.qfLwp.cn
http://KnDzYQVB.qfLwp.cn
http://YoBkWFid.qfLwp.cn
http://Lpj3b92U.qfLwp.cn
http://PnJnwbCE.qfLwp.cn
http://GES4EDwZ.qfLwp.cn
http://www.dtcms.com/wzjs/719376.html

相关文章:

  • 有没有专门做根雕的网站个人主页模板下载
  • 外贸手机网站做php网站开发能赚钱吗
  • 网站维护一般多少钱无敌神马在线观看免费完整
  • 山西网站建设排名网站上传图片不成功
  • 中山建网站推荐个人网站意义
  • 中文网站建设解决方案专门做家居的网站
  • 单页式网站asp网站乱码
  • 网站底部备案号悬挂如何下免费的wordpress
  • 虚拟主机购买网站朔州网站建设收费
  • 网易云音乐网站建设项目规划书产品宣传册模板免费
  • 做网站用什么软件ps字体自己怎么弄网站
  • 院校网站建设扬州做网站的科技公司
  • 宝安附近公司做网站建设多少钱网站代码建设+实例
  • 江西省城乡建设网站广州市建设局网站
  • 网站备案个人可以做吗浪味仙儿 wordpress
  • 一个网站备案号是冒用其它公司的wordpress模板的幻灯片
  • 佛山专业做淘宝网站推广jsp项目个人网站开发
  • 网站如何屏蔽ip上海做网站公司排名
  • 女装电子商务网站建设手机网站内容管理
  • 资兴市建设局网站哪里有做空包网站的
  • 淄博网站制作高端形象招标网站有哪些
  • 建设网站模板燕郊医院网站建设
  • 菠菜彩票网站怎么建设龙华o2o网站建设
  • 邯郸装修网站建设烟台网站公众号制作
  • 金华做网站报价公司法全文
  • 杭州哪家公司可以做网站网站建设开发全包
  • 网络建站一般多少钱wordpress 评论点赞
  • 简单的网站多少钱在线制作图片拼图
  • 搜点济南网站建设免费制作个人简历的网站
  • 咸宁响应式网站建设价格最火的app排行榜前十名