`
aty
  • 浏览: 36514 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

InheritableThreadLocal使用(二)只在子线程创建的时候,继承一次

阅读更多
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中父线程此刻的值,但是只会在创建的时候继承一次。如果在子线程的生命周期内,父线程修改了自己的线程局部变量值,子线程再次读取,获取的仍然是第一次读取的值。即:子线程继承父线程的值,只是在线程创建的时候继承一次。之后子线程与后父线程便相互独立。

 

 

分享到:
评论

相关推荐

    InheritableThreadLocal & ThreadLocal

    这意味着,当一个新线程通过Thread.start()方法被创建时,它会自动复制父线程中的所有InheritableThreadLocal变量,使得这些变量在子线程中也可用。 三、ThreadLocal与InheritableThreadLocal的区别 1. 变量继承性...

    Java_为frameworkmiddleware提供了一个增强的InheritableThreadLocal,即使使.zip

    而`InheritableThreadLocal`则在`ThreadLocal`的基础上增加了一项功能:当新线程被创建(例如通过`Thread.start()`或`ExecutorService.submit()`)时,这些新线程会自动继承其父线程中`InheritableThreadLocal`变量...

    Android 详解ThreadLocal及InheritableThreadLocal

    **InheritableThreadLocal** 类与ThreadLocal类似,但其特性是当新线程被创建时(比如通过`Thread.start()`),新线程会继承父线程中InheritableThreadLocal变量的副本。这意味着在子线程中可以访问到父线程中设置的...

    ThreadLocal、InheritableThreadLocal详解

    如果一个线程创建了一个子线程,那么子线程会继承父线程中的InheritableThreadLocal变量。这意味着子线程可以访问到父线程设置的值,这在某些情况下非常有用,例如初始化子线程的环境参数。 ```java ...

    Java后端开发,JUC并发编程Java后端开发,JUC并发编程

    在Java中,创建线程有多种方式,最简单的是继承Thread类或者实现Runnable接口。例如,通过继承Thread类来创建线程: ```java class MyThread extends Thread { @Override public void run() { // 线程执行代码 ...

    高级Java经典面试题2019

    - **乐观锁**:假设冲突很少发生,因此只在提交更改时检查版本号。 - **悲观锁**:假设冲突经常发生,因此在开始操作前就加锁。 - **公平锁**/ **非公平锁**:公平锁按照请求顺序分配锁,而非公平锁可能会让后来的...

    Spring Security3.1最新配置实例

    2. **配置SecurityContextHolder策略**:设置SecurityContextHolder的策略为`MODE_INHERITABLETHREADLOCAL`,使得当前线程中的安全上下文可以在子线程中继承。 3. **配置Spring Security核心组件**:创建一个名为`...

    Java进阶知识点汇总.pdf

    - **InheritableThreadLocal**:继承自`ThreadLocal`,用于创建可继承的线程局部变量。 ##### java.lang.ref包下的类 - **Reference**:基类,所有引用类型都继承自该类。 - **PhantomReference**(虚引用):仅...

    Spring Cloud体系实现标签路由的方法示例

    3. 线程上下文传递:利用`InheritableThreadLocal`确保标签信息在子线程间传递。 4. Feign拦截器:在Feign客户端调用时,获取并添加标签信息至请求中。 通过这种方式,Spring Cloud体系可以提供强大的路由控制能力...

    java.lang包介绍

    在Java 2(J2SE)中,`java.lang`包添加了一些新的类和方法,如`InheritableThreadLocal`,`ThreadLocal`的扩展,使得子线程可以继承父线程的变量,以及`SecurityManager`,用于实现安全管理策略。 过时方法在Java ...

    java-lang包详解

    - **InheritableThreadLocal**: 与ThreadLocal类似,但子线程可以继承父线程的值。 - **Compiler**: 提供编译运行时的类。 - **Process**: 表示操作系统进程,提供了与进程相关的操作。 - **RuntimePermission**...

    详解Spring Security的Web应用和指纹登录实践

    SecurityContextHolder是存储SecurityContext的容器,提供了多种存储模式,如MODE_THREADLOCAL(默认,安全上下文存储在线程中)、MODE_INHERITABLETHREADLOCAL(子线程可以继承父线程的上下文)和MODE_GLOBAL(全局...

    spring基于通用Dao的多数据源配置详解

    首先,我们需要创建一个自定义的数据源类`MultipleDataSource`,它继承自`AbstractRoutingDataSource`。这个类的作用是根据当前线程上下文中的数据源键(dataSourceKey)动态切换数据源。例如: ```java package ...

Global site tag (gtag.js) - Google Analytics