package thread.local; public class Test { // 线程局部变量:初始值默认是null private final static InheritableThreadLocal<String> basicholder = new InheritableThreadLocal<String>(); // 存放的是引用 private final static InheritableThreadLocal<StringBuilder> referHolder = new InheritableThreadLocal<StringBuilder>(); public static void main(String[] args) throws Exception { basicholder.set("parent initial value"); referHolder.set(new StringBuilder("reference")); Thread a = new Thread() { public void run() { for (int i = 0; i < 2; i++) { // 子线程能够获得父线程的值 System.out.println("child-thread-begin=" + basicholder.get()); System.out.println("child-thread-begin2=" + referHolder.get()); try { Thread.sleep(200); } catch (InterruptedException e) { } } } }; a.start(); Thread.sleep(100); basicholder.set("parent reset this value"); referHolder.get().append(" new value"); System.out.println("end=" + basicholder.get()); System.out.println("end=" + referHolder.get()); } }
执行结果:
child-thread-begin=parent initial value
child-thread-begin2=reference
end=parent reset this value
end=reference new value
child-thread-begin=parent initial value
child-thread-begin2=reference new value
创建子线程的时候,子线程会继承InheritableThreadLocal中父线程此刻的值,但是只会在创建的时候继承一次。如果在子线程的生命周期内,父线程修改了自己的线程局部变量值,子线程再次读取,获取的仍然是第一次读取的值。即:子线程继承父线程的值,只是在线程创建的时候继承一次。之后子线程与后父线程便相互独立。
相关推荐
这意味着,当一个新线程通过Thread.start()方法被创建时,它会自动复制父线程中的所有InheritableThreadLocal变量,使得这些变量在子线程中也可用。 三、ThreadLocal与InheritableThreadLocal的区别 1. 变量继承性...
而`InheritableThreadLocal`则在`ThreadLocal`的基础上增加了一项功能:当新线程被创建(例如通过`Thread.start()`或`ExecutorService.submit()`)时,这些新线程会自动继承其父线程中`InheritableThreadLocal`变量...
**InheritableThreadLocal** 类与ThreadLocal类似,但其特性是当新线程被创建时(比如通过`Thread.start()`),新线程会继承父线程中InheritableThreadLocal变量的副本。这意味着在子线程中可以访问到父线程中设置的...
如果一个线程创建了一个子线程,那么子线程会继承父线程中的InheritableThreadLocal变量。这意味着子线程可以访问到父线程设置的值,这在某些情况下非常有用,例如初始化子线程的环境参数。 ```java ...
在Java中,创建线程有多种方式,最简单的是继承Thread类或者实现Runnable接口。例如,通过继承Thread类来创建线程: ```java class MyThread extends Thread { @Override public void run() { // 线程执行代码 ...
- **乐观锁**:假设冲突很少发生,因此只在提交更改时检查版本号。 - **悲观锁**:假设冲突经常发生,因此在开始操作前就加锁。 - **公平锁**/ **非公平锁**:公平锁按照请求顺序分配锁,而非公平锁可能会让后来的...
2. **配置SecurityContextHolder策略**:设置SecurityContextHolder的策略为`MODE_INHERITABLETHREADLOCAL`,使得当前线程中的安全上下文可以在子线程中继承。 3. **配置Spring Security核心组件**:创建一个名为`...
- **InheritableThreadLocal**:继承自`ThreadLocal`,用于创建可继承的线程局部变量。 ##### java.lang.ref包下的类 - **Reference**:基类,所有引用类型都继承自该类。 - **PhantomReference**(虚引用):仅...
3. 线程上下文传递:利用`InheritableThreadLocal`确保标签信息在子线程间传递。 4. Feign拦截器:在Feign客户端调用时,获取并添加标签信息至请求中。 通过这种方式,Spring Cloud体系可以提供强大的路由控制能力...
在Java 2(J2SE)中,`java.lang`包添加了一些新的类和方法,如`InheritableThreadLocal`,`ThreadLocal`的扩展,使得子线程可以继承父线程的变量,以及`SecurityManager`,用于实现安全管理策略。 过时方法在Java ...
- **InheritableThreadLocal**: 与ThreadLocal类似,但子线程可以继承父线程的值。 - **Compiler**: 提供编译运行时的类。 - **Process**: 表示操作系统进程,提供了与进程相关的操作。 - **RuntimePermission**...
SecurityContextHolder是存储SecurityContext的容器,提供了多种存储模式,如MODE_THREADLOCAL(默认,安全上下文存储在线程中)、MODE_INHERITABLETHREADLOCAL(子线程可以继承父线程的上下文)和MODE_GLOBAL(全局...
首先,我们需要创建一个自定义的数据源类`MultipleDataSource`,它继承自`AbstractRoutingDataSource`。这个类的作用是根据当前线程上下文中的数据源键(dataSourceKey)动态切换数据源。例如: ```java package ...