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

相关推荐
risc1234563 分钟前
人是可以改变的
笔记
happymaker06264 分钟前
Spring学习日记——DAY04(复杂对象创建,AOP静态代理)
java·开发语言·spring
小江的记录本5 分钟前
【MySQL】《MySQL日志面试背诵版+思维导图》(核心考点 + MySQL 8.0最新优化)
java·数据库·后端·python·sql·mysql·面试
祁白_9 分钟前
无字母数字 Webshell 绕过
笔记·web安全·测试·ctf
OYangxf11 分钟前
对于AOF模块和命令层交互的理解
redis
我命由我1234513 分钟前
Android Framework P2 - 开机启动 Zygote 进程、Zygote 的预加载机制
android·java·开发语言·python·java-ee·intellij-idea·zygote
JAVA面经实录91716 分钟前
Java Codex 企业标准Prompt库
java·开发语言·prompt
摇曳的精灵19 分钟前
直接关掉jar包,会影响没有执行完的任务吗
java·jar
yoyo_zzm21 分钟前
PHP vs Java:后端语言终极选择指南
java·spring boot·后端·架构·php
m0_5027249523 分钟前
golang 、java、c++、javascript 语言switch case异同
java·javascript·c++·golang