多线程 - 一篇带你理解 InheritableThreadLocal 作用

简介: 多线程 - 一篇带你理解 InheritableThreadLocal 作用

代码

/**
 * @author Lux Sun
 * @date 2021/12/30
 */
public class Cat {
    public Cat(String name) {
        this.name = name;
    }
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return "Cat{" +
                "name='" + name + '\'' +
                '}';
    }
}
/**
 * 容器上下文
 * @author Lux Sun
 * @date 2021/12/29
 */
public class ContainerContext {
    public ContainerContext(String id, Cat cat) {
        this.id = id;
        this.cat = cat;
    }
    private String id;
    private Cat cat;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public Cat getCat() {
        return cat;
    }
    public void setCat(Cat cat) {
        this.cat = cat;
    }
    @Override
    public String toString() {
        return "ContainerContext{" +
                "id='" + id + '\'' +
                ", cat=" + cat +
                '}';
    }
}
/**
 * 容器处理器
 * @author Lux Sun
 * @date 2021/12/29
 */
public class ContainerContextHandler {
    /**
     * 父子线程圈传递 ContainerContext
     */
    private static final InheritableThreadLocal<ContainerContext> INHERITABLE_THREAD_LOCAL = new InheritableThreadLocal<>();
    /*************************** Getter/Setter ***************************/
    public static ContainerContext getContainerContext() {
        return INHERITABLE_THREAD_LOCAL.get();
    }
    public static void setContainerContext(ContainerContext containerContext) {
        INHERITABLE_THREAD_LOCAL.set(containerContext);
    }
}
import lombok.SneakyThrows;
import java.util.concurrent.TimeUnit;
/**
 * @author Lux Sun
 * @date 2021/12/30
 */
public class Test {
    /**
     * 主线程
     * @param args
     */
    public static void main(String[] args) throws InterruptedException {
        // 主线程
        ContainerContext containerContext = new ContainerContext("main", new Cat("main_cat"));
        ContainerContextHandler.setContainerContext(containerContext);
        // 子线程
        new ChildThread().start();
        TimeUnit.MILLISECONDS.sleep(500);
        // 打印主线程信息
        print();
    }
    /**
     * 子线程
     */
    private static class ChildThread extends Thread {
        @SneakyThrows
        @Override
        public void run() {
            // 打印主线程信息
            print();
            ContainerContext containerContext = new ContainerContext("child", new Cat("child_cat"));
            ContainerContextHandler.setContainerContext(containerContext);
            // 打印子线程信息
            print();
            // 孙子线程
            new GrandChildThread().start();
            TimeUnit.MILLISECONDS.sleep(200);
            // 打印子线程信息
            print();
        }
    }
    /**
     * 孙子线程
     */
    private static class GrandChildThread extends Thread {
        @Override
        public void run() {
            // 打印子线程信息
            print();
            ContainerContext containerContext = new ContainerContext("grandchild", new Cat("grandchild_cat"));
            ContainerContextHandler.setContainerContext(containerContext);
            // 打印孙子线程信息
            print();
        }
    }
    /**
     * 打印
     * @param
     */
    private static void print() {
        System.out.println(ContainerContextHandler.getContainerContext());
    }
}

输出结果

ContainerContext{id='main', cat=Cat{name='main_cat'}}
ContainerContext{id='child', cat=Cat{name='child_cat'}}
ContainerContext{id='child', cat=Cat{name='child_cat'}}
ContainerContext{id='grandchild', cat=Cat{name='grandchild_cat'}}
ContainerContext{id='child', cat=Cat{name='child_cat'}}
ContainerContext{id='main', cat=Cat{name='main_cat'}}

总结

一句话:父子线程组隔离通信机制。

使用场景:父 - 子 - 孙子线程通信传递,但如果想要到某一个子树更新内容,不会影响父或祖父线程,但是会从自己这边开始下去继承的时候会保持一致。所以这就解决了父子线程组的通信,组与组之间的隔离机制。

这里还涉及 InheritableThreadLocal 对象对于可变对象 & 不可变对象的不同结果,详情看这篇文章:……


目录
相关文章
|
23天前
|
存储 Java 数据安全/隐私保护
【JUC】ThreadLocal 如何实现数据的线程隔离?
【1月更文挑战第15天】【JUC】ThreadLocal 如何实现数据的线程隔离?ThreadLocal 导致内存泄漏问题?
|
7月前
|
监控 安全 算法
Thread入门与线程方法详解及多线程安全
Thread入门与线程方法详解及多线程安全
22 0
|
8月前
|
Java API Go
线程介绍,线程与进程区别,如何使用多线程,Thread类,Runnable接口,补充知识(方法重载,方法重写)
线程介绍,线程与进程区别,如何使用多线程,Thread类,Runnable接口,补充知识(方法重载,方法重写)
|
9月前
|
安全 Java 编译器
Java多线程(2)---线程控制和线程安全的详细讲解
Java多线程(2)---线程控制和线程安全的详细讲解
38 0
|
设计模式 缓存 安全
多线程(五):wait 和 单例设计模式
多线程(五):wait 和 单例设计模式
83 0
多线程(五):wait 和 单例设计模式
多线程之常见方法使用
线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位;进程是系统资源分配的单位,线程是系统调度的单位。一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线;进程之间相互独立,进程之间不能共享资源,而线程共享所在进程的地址空间和其它资源。同时线程还有自己的栈和栈指针,程序计数器等寄存器。
|
小程序 调度
一文掌握多线程并发中 Thread 类 yield 方法具体作用
一文掌握多线程并发中 Thread 类 yield 方法具体作用
295 0
一文掌握多线程并发中 Thread 类 yield 方法具体作用
|
Java 调度
【多线程:常见方法】
【多线程:常见方法】
85 0
|
调度
【多线程:一些方法的注意点】
【多线程:一些方法的注意点】
87 0
|
存储 应用服务中间件
多线程的作用
随着工业的进步,现在的笔记本、台式机乃至商用的应用服务器至少也都是双核的,4核、8核甚至16核的也都不少见,如果是单线程的程序,那么在双核CPU上就浪费了50%,在4核CPU上就浪费了75%。
134 0

热门文章

最新文章