ThreadLocal、InheritableThreadLocal、TransmittableThreadLocal

API

  • public T get()
    从线程上下文环境中获取设置的值。
  • public void set(T value)
    将值存储到线程上下文环境中,供后续使用。
  • public void remove()
    清除线程本地上下文环境。

InheritableThreadLocal

子线程可以访问父线程中的线程本地变量,更严谨的说法是子线程可以访问在创建子线程时父线程当时的本地线程变量,因为其实现原理就是在创建子线程将父线程当前存在的本地线程变量拷贝到子线程的本地线程变量中。

1、直接通过set改变对象内容时,线程不安全

如果线程本地变量是可写的,那么任意子线程针对本地变量的修改都会影响到主线程的本地变量(本质上是同一个对象)。

这里对于共享变量的修改存在线程安全问题太正常了。主要点在于线程池中InheritableThreadLocal失效。

2、线程池中InheritableThreadLocal失效

在使用线程池时,InheritableThreadLocal会完全失效;因为父线程的ThreadLocalMap是通过实例化一个Thread时赋值给子线程的,而线程池在执行异步任务时可能不需要创建新的线程,因此也就不会再传递父线程的ThreadLocalMap给子线程。

TransmittableThreadLocal

实现线程本地变量在线程池的执行过程中,能正常的访问父线程设置的线程变量。

参考文档:https://github.com/alibaba/transmittable-thread-local

相关推荐
lkbhua莱克瓦2412 分钟前
Java练习-正则表达式 1
java·笔记·正则表达式·github
yue00814 分钟前
C#类继承
java·开发语言·c#
凯芸呢1 小时前
Java中的数组(续)
java·开发语言·数据结构·算法·青少年编程·排序算法·idea
竹竹零1 小时前
JacksonUtil--序列化与反序列化
java·开发语言·windows
钱多多_qdd1 小时前
基础篇:IoC(三):Bean实例化策略InstantiationStrategy
java·spring
float_com1 小时前
【java基础语法】---- 综合训练
java
Dyan_csdn1 小时前
springboot系统设计选题3
java·spring boot·后端
sheji34161 小时前
【开题答辩全过程】以 基于Java的旅游网站的设计与开发为例,包含答辩的问题和答案
java·开发语言·旅游
ABdolphin1 小时前
Spring-cloud 主键Eureka
java·云原生·eureka
Aesopcmc2 小时前
Maven打包时指定输出路径、以时间戳命名包名和路径名,结合IDEA以指令脚本方式动态配置输出目录
java·自动化·maven·intellij-idea