并发编程笔记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介绍

相关推荐
liangshanbo121514 分钟前
大模型 RAG 向量数据工程全链路架构笔记
笔记·架构
罗罗攀26 分钟前
PyTorch学习笔记|张量的广播和科学运算
人工智能·pytorch·笔记·python·学习
MegaDataFlowers39 分钟前
快速上手Spring
java·后端·spring
小江的记录本39 分钟前
【MyBatis-Plus】Spring Boot + MyBatis-Plus 进行各种数据库操作(附完整 CRUD 项目代码示例)
java·前端·数据库·spring boot·后端·sql·mybatis
左左右右左右摇晃41 分钟前
Java 笔记--OOM产生原因以及解决方法
java·笔记
大傻^1 小时前
Spring AI Alibaba Function Calling:外部工具集成与业务函数注册
java·人工智能·后端·spring·springai·springaialibaba
逆境不可逃1 小时前
LeetCode 热题 100 之 33. 搜索旋转排序数组 153. 寻找旋转排序数组中的最小值 4. 寻找两个正序数组的中位数
java·开发语言·数据结构·算法·leetcode·职场和发展
码界奇点1 小时前
基于Spring Boot的医院药品管理系统设计与实现
java·spring boot·后端·车载系统·毕业设计·源代码管理
小旭95271 小时前
Spring MVC :从入门到精通(下)
java·后端·spring·mvc
夏语灬1 小时前
MySQL大小写敏感、MySQL设置字段大小写敏感
java