并发编程笔记8--ThreadLocal结构详解

ThreadLocal,即线程变量,是一个以ThreadLocal对象为键,任意对象为值的存储结构。这个结构被附带在线程上,也就是说一个线程可以根据一个ThreadLocal对象查询到绑定在这个线程上的值。可以通过set(T)方法来设置一个值,在当前线程下在通过get()方法获取到原先设置的值。

首先来看下set方法,基于JDK8

复制代码
/**
     * 将此线程局部变量的当前线程副本设置为指定值。大多数子类不需要重新此方法,
     * 仅依靠initialValue方法来设置线程局部变量的值
     *
     * @param value the value to be stored in the current thread's copy of
     *        this thread-local.
     */
    public void set(T value) {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
    }
    
     /**
     * 获取与ThreadLocal关联的map,在InheritableThreadLocal中重写
     *
     * @param  t the current thread
     * @return the map
     */
    ThreadLocalMap getMap(Thread t) {
        return t.threadLocals;
    }

在set方法中,首先获取当前线程,然后获取当前线程关联的ThreadLocalMap,而ThreadLocalMap是ThreadLocal类中定义的一个结构。ThreadLocalMap的部分源码如下:

复制代码
static class ThreadLocalMap {
				static class Entry extends WeakReference<ThreadLocal<?>> {
            /** The value associated with this ThreadLocal. */
            Object value;

            Entry(ThreadLocal<?> k, Object v) {
                super(k);
                value = v;
            }
        }
}

其在ThreadLocalMap中定义了一个Entry对象用来存储我们在set方法中方的值。

ThreadLocal介绍

相关推荐
岁岁养乐多4 分钟前
深入解析 Spring @Cacheable 注解:从声明式缓存 到多维替代方案
java
砚凝霜4 分钟前
软考网络工程师|第 9 章 网络诊断命令 + 故障工具 + 故障排查完整笔记
网络·笔记
开发者联盟league12 分钟前
maven核心插件介绍
java·maven
编程令我快乐17 分钟前
maven中deploy 的流程
java·maven
jaysee-sjc24 分钟前
【JavaWeb】Tlias智能学习辅助系统|后端Web实战(登录认证)
java·开发语言·前端·学习·mybatis
南城以南溫暖如初14739 分钟前
社区健身小程序开发流程详解:技术选型与实施经验分享
java·经验分享·spring boot·mysql·vue·apache
万维易源42 分钟前
免费药品信息查询:用API 读懂常用药
java·前端·数据库·药品信息·药品查询·药品查询api
wear工程师1 小时前
Java 类初始化到底何时触发?别把加载、连接和 static 执行混在一起
java·jvm
hard_hot1 小时前
RabbitMQ异步下单架构设计
java·rabbitmq·java-rabbitmq
郑州光合科技余经理1 小时前
餐饮预定系统架构拆解:订单链路、权限组织与私有化源码交付
java·开发语言·前端·数据库·人工智能·系统架构·php