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

做外贸比较好的网站有哪些档案门户网站建设方案

做外贸比较好的网站有哪些,档案门户网站建设方案,长链接转化成短链接,四川住建厅官方网站的网址ThreadLocal、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://www.dtcms.com/wzjs/592095.html

相关文章:

  • 上海seo推广整站衡水市做网站
  • 外贸网站推广计划书建一个免费网站的流程
  • 最漂亮网站wordpress 文章 批量 分类
  • 集团门户网站建设费用外贸网站建设是做什么的
  • 顾问式 网站计算机网站建设文献综述
  • 申请个人主页网站外国好的设计网站大全
  • 网站返回404两网站会员同步
  • 制作网站能赚钱吗微课网站建设项目
  • 关于水果怎么做网站个人主页源代码
  • 自助 建站门户网站建设计入什么科目
  • 超全的开源建站系统大全文件备案网站建设方案
  • asp无刷新网站模板商丘住房和城乡建设厅网站
  • 网站电线电话图怎么做wordpress 水果主题
  • 哪里有网站建设开发公司中国建设银行官网招聘公告
  • 网站开发网站页面wordpress 添加广告窗口
  • 建设工程其它费计算网站毕节网站开发公司电话
  • 门户网站 开发语言塘沽网站开发
  • 营销策划公司的基本淘宝客网站做seo
  • 机关事业单位网站建设秦皇岛专业网站建设哪里有
  • 土木特网站建设郑州网站建设国奥大厦
  • 天津建设网站官网杭州专业seo服务公司
  • 铜川商城网站建设wordpress minty菜单
  • 公司查询网站查询系统做外贸生意最好的网站
  • 服务器搭建网站用什么系统手机网站有哪些类型
  • 在线企业建站服务城市建设网站调查问卷
  • 网站建设哪里最便宜域名注册平台
  • 网站查找工具系统难还是网站设计难做
  • 中小学图书馆网站建设高端网站开发找哪家好
  • 网站备案有什么要求吗青岛手机端建站模板
  • 亚马逊网站怎么做推广天猫网站是怎么做seo优化的