热点新闻
Java 线程之 ThreadLocal 应用
2023-08-05 00:50  浏览:804  搜索引擎搜索“手机晒展网”
温馨提示:信息一旦丢失不一定找得到,请务必收藏信息以备急用!本站所有信息均是注册会员发布如遇到侵权请联系文章中的联系方式或客服删除!
联系我时,请说明是在手机晒展网看到的信息,谢谢。
展会发布 展会网站大全 报名观展合作 软文发布

1. ThreadLocal

  • 普通的静态变量是所有线程共享的,ThreadLocal 可让每个线程创建自己的本地变量
  • ThreadLocal 为每一个线程都提供一个变量副本,隔离多个线程对数据的数据共享

2. 实战

  • 注:ThreadLocal不可以使用原子类型,只能使用Object类型

2.1 父子线程变量继承:ThreadLocal 与 InheritableThreadLocal

@Slf4j public class Demo { // 案例一:ThreadLocal 不支持继承 // 16:22:57.889 [main] - Hello // 16:22:57.889 [Thread-1] - null 子线程获取不到父线程的本地变量 // public static ThreadLocal<String> threadLocal = new ThreadLocal<>(); // 案例二:InheritableThreadLocal 应用场景:获取用户登陆信息 // 16:39:13.397 [Thread-1] - Hello // 16:39:13.397 [main] - Hello public static ThreadLocal<String> threadLocal = new InheritableThreadLocal<>(); @Test public void threadLocalDemo() { threadLocal.set("Hello"); new Thread(() -> { log.info(threadLocal.get()); }).start(); log.info(threadLocal.get()); } }

3. 应用场景

3.1 应用

Spring 事务处理使用 ThreadLocal

3.2 ThreadLocal 慎用场景

场景一:线程池里线程调用 ThreadLocal,
线程池的线程都是复用的,在线程池中线程非常难结束甚至于永远不会结束,线程持续的时间将不可预测

场景二:异步程序中使用ThreadLocal
因为线程将请求发送后,不会等待远程返回结果,而是继续向下运行,真正的返回结果得到后,处理的线程可能是其他的线程

发布人:ce01****    IP:117.173.23.***     举报/删稿
展会推荐
让朕来说2句
评论
收藏
点赞
转发