JDK提供了InheritableThreadLocal类,用来让子线程继承父线程的值。在创建子线程的时候,子线程会接收此刻父线程线程局部变量的初始值。
package thread.local; public class Test { // 线程局部变量:初始值默认是null private final static InheritableThreadLocal<String> parentholder = new InheritableThreadLocal<String>(); // 线程局部变量:初始值默认是null private final static ThreadLocal<String> selfholder = new ThreadLocal<String>(); public static void main(String[] args) throws Exception { parentholder.set("parent initial value"); selfholder.set("parent initial value"); Thread a = new Thread() { public void run() { // 子线程能够获得父线程的值 System.out.println("child-thread-begin=" + parentholder.get()); // 子线程获取的是自己的初值 System.out.println("self child-thread-begin=" + selfholder.get()); } }; a.start(); Thread.sleep(100); } }
相关推荐
总的来说,ThreadLocal和InheritableThreadLocal是处理线程相关数据的有效工具,但使用时需谨慎,避免引发并发问题。在Android开发中,它们常用于存储与线程生命周期相关的数据,如Looper、Handler的MessageQueue等...
4. 在Servlet容器中,谨慎使用InheritableThreadLocal,因为线程池中的线程可能会被复用,可能导致错误的会话信息传递。 总之,理解并熟练运用ThreadLocal和InheritableThreadLocal是Java并发编程中不可或缺的知识...
在实际开发中,应谨慎使用`InheritableThreadLocal`,并结合其他设计模式和最佳实践,如使用拦截器、依赖注入等方法来管理上下文信息,以提高代码的可读性和可维护性。 文件`transmittable-thread-local_master.zip...
例如,如果父线程设置了 `InheritableThreadLocal` 的值,然后创建并启动一个子线程,子线程可以直接获取到这个值,而使用普通的 `ThreadLocal` 是无法实现这种效果的。 ```java public class ...
InheritableThreadLocal 的作用是当我们需要在子线程中使用父线程中的值时,可以像使用 ThreadLocal 一样来使用 InheritableThreadLocal。在 InheritableThreadLocal 的 JDK 源码中,我们可以看到它继承了 ...
:pushpin: TransmittableThreadLocal(TTL) :pushpin: ...但对于使用线程池等会池化线程化的执行组件的情况,线程由线程池创建好,并且线程是池化起来反复使用的;这时父子线程关系的ThreadLocal值传
5. **启动安全上下文**:在Spring的初始化代码中,调用`SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL);`来激活安全上下文。 6. **测试和调试**:使用模拟用户或真实...
使用TransmittableThreadLocal 可以解决多种线程池之间的数据传递问题,如线程池之间的数据共享、线程池之间的任务传递等问题。 在实际应用中,TransmittableThreadLocal 可以应用于各种场景,如在微服务架构中,多...
Scoped Value 解决了在线程之间共享变量的问题,ThreadLocal 和 InheritableThreadLocal 都有其缺陷。ThreadLocal 需要手动清理,且变量不能被子线程继承;InheritableThreadLocal 可以共享信息,但是数据会拷贝多份...
2. **配置SecurityContextHolder策略**:设置SecurityContextHolder的策略为`MODE_INHERITABLETHREADLOCAL`,使得当前线程中的安全上下文可以在子线程中继承。 3. **配置Spring Security核心组件**:创建一个名为`...
Spring AOP使用动态代理技术,对于实现了接口的类使用JDK动态代理,而对于未实现接口的类则使用Cglib代理。Spring AOP支持通过配置来指定增强逻辑,如前置通知、后置通知等。 #### 控制反转(IoC)设计思想 控制...
Java提供了volatile关键字、等待/通知机制、join方法、InheritableThreadLocal、MappedByteBuffer等多种线程通信机制。 #### Java并发机制 在Java中,JUC并发包提供了一套丰富的并发工具,例如: - **...
同时,一些过时的方法也被标记出来,虽然仍可供老程序使用,但不建议在新代码中使用。 总之,java.lang包是Java编程的基础,它的类和接口构成了Java语言的核心,理解并熟练运用这些元素是成为一名合格的Java开发者...
- **InheritableThreadLocal**:继承自`ThreadLocal`,用于创建可继承的线程局部变量。 ##### java.lang.ref包下的类 - **Reference**:基类,所有引用类型都继承自该类。 - **PhantomReference**(虚引用):仅...
`RequestZoneLabelContext`使用`InheritableThreadLocal`来保存线程上下文,这样即使在请求处理过程中产生了新的线程,这些线程也能继承到标签信息。当请求结束时,会清除`RequestZoneLabelContext`中的信息,防止...
**其他并发工具类与锁原理**:这部分内容涉及ThreadLocal的工作原理、InheritableThreadLocal如何传递线程局部变量、CyclicBarrier和CountDownLatch的区别与用法、Semaphore信号量机制、CopyOnWriteArrayList如何...