栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

请说一下ThreadLocal的原理?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

请说一下ThreadLocal的原理?

Thread
类源代码入手。

public class Thread implements Runnable { ......//与此线程有关的ThreadLocal值。由ThreadLocal类维护ThreadLocal.ThreadLocalMap threadLocals = null;//与此线程有关的InheritableThreadLocal值。由InheritableThreadLocal类维护ThreadLocal.ThreadLocalMap inheritableThreadLocals = null; ......}

从上面

Thread
类 源代码可以看出
Thread
类中有一个
threadLocals
和 一个
inheritableThreadLocals
变量,它们都是
ThreadLocalMap
类型的变量,我们可以把
ThreadLocalMap
理解为
ThreadLocal
类实现的定制化的
HashMap
。默认情况下这两个变量都是null,只有当前线程调用
ThreadLocal
类的
set
get
方法时才创建它们,实际上调用这两个方法的时候,我们调用的是
ThreadLocalMap
类对应的
get()
set()
方法。

ThreadLocal
类的
set()
方法

    public void set(T value) {        Thread t = Thread.currentThread();        ThreadLocalMap map = getMap(t);        if (map != null) map.set(this, value);        else createMap(t, value);    }    ThreadLocalMap getMap(Thread t) {        return t.threadLocals;    }

通过上面这些内容,我们足以通过猜测得出结论:最终的变量是放在了当前线程的

ThreadLocalMap
中,并不是存在
ThreadLocal
上,ThreadLocal 可以理解为只是ThreadLocalMap的封装,传递了变量值。

每个Thread中都具备一个ThreadLocalMap,而ThreadLocalMap可以存储以ThreadLocal为key的键值对。 比如我们在同一个线程中声明了两个

ThreadLocal
对象的话,会使用
Thread
内部都是使用仅有那个
ThreadLocalMap
存放数据的,
ThreadLocalMap
的 key 就是
ThreadLocal
对象,value 就是
ThreadLocal
对象调用
set
方法设置的值。
ThreadLocal
是 map结构是为了让每个线程可以关联多个
ThreadLocal
变量。这也就解释了ThreadLocal声明的变量为什么在每一个线程都有自己的专属本地变量。

public class Thread implements Runnable { ......//与此线程有关的ThreadLocal值。由ThreadLocal类维护ThreadLocal.ThreadLocalMap threadLocals = null;//与此线程有关的InheritableThreadLocal值。由InheritableThreadLocal类维护ThreadLocal.ThreadLocalMap inheritableThreadLocals = null; ......}

ThreadLocalMap
ThreadLocal
的静态内部类。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/363515.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号