ThreadLocal 原理解析

1、前言

我得为我之前的行为道歉,之前都是看别人的博客抄抄抄,结果抄了一波非重点的东西,也不知道啥意思。其实不管是学习还是写博客,最重要的是抓住重点,由重点来突破,对于理解知识会有很大的帮助。

2、原理

我们在使用 ThreadLocal 时,经常会这样使用:

    private ThreadLocal<String> threadLocal = new ThreadLocal<>();
     
    public void testThreadLocal(){
        threadLocal.set("");
        threadLocal.get();
    }

使用 set 设置当前线程的数据,使用 get 获取当前线程设置的数据。

我们点进去 set、get 方法 方法发现:

   // 放数据
   public void set(T value) {
       Thread t = Thread.currentThread();
       ThreadLocalMap map = getMap(t);
       if (map != null)
           map.set(this, value);
       else
           createMap(t, value); // 没有则创建一个 map
   }

   ThreadLocalMap getMap(Thread t) {
       return t.threadLocals;
   }


   // 取数据
   public T get() {
       Thread t = Thread.currentThread();
       ThreadLocalMap map = getMap(t);
       if (map != null) {
           ThreadLocalMap.Entry e = map.getEntry(this);
           if (e != null) {
               @SuppressWarnings("unchecked")
               T result = (T)e.value;
               return result;
           }
       }
       return setInitialValue();
   }

如果没有 ThreadLocalMap 会新建一个 ThreadLocalMap,然后把值放进去,最后把 ThreadLocalMap 赋值给线程的 threadLocals;如果能从线程的 threadLocals 拿出 ThreadLocalMap 则拿出来,直接放值。ThreadLocalMap 的 key 为 ThreadLocal 自身,vaule 就是要放的值。

因为这个 ThreadLocalMap 封闭在不同的线程中,当然能做到线程安全

所以这个问题很简单。。。。。。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容