美文网首页
ThreadLocal剖析

ThreadLocal剖析

作者: 策马踏清风 | 来源:发表于2020-04-07 19:02 被阅读0次

ThreadLocal可以在多线程下实现各个线程的数据隔离

存储原理

直接看ThreadLocalget()方法

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 getMap(Thread t) {
        return t.threadLocals;
    }

可以看出

  1. 数据是使用ThreadLocalMap存储的
  2. ThreadLocalMap是存放在线程对象上,所以可以保证线程之间的独立

再看map.getEntry(this)这句话调用的方法

private Entry getEntry(ThreadLocal<?> key) {
            int i = key.threadLocalHashCode & (table.length - 1);
            Entry e = table[i];
            if (e != null && e.get() == key)
                return e;
            else
                return getEntryAfterMiss(key, i, e);
        }

可以看出

  1. 存放在线程的Map通过ThreadLocal对象的threadLocalHashCode获取具体是那个对象
  2. ThreadLocal对象只是获取值的key真正的数据保存在Thread线程对象上

弱引用

存储数据的ThreadLocalMap里可以看到

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

            Entry(ThreadLocal<?> k, Object v) {
                super(k);
                value = v;
            }
        }
  1. entry的键是被弱引用包裹的,即GC的时候如果没有强引用则会被直接清理。
  2. 即外面的ThreadLocal如果被赋值为null,即取消对象的强引用。不会因为ThreadLocalMap里面还有强引用而无法被清除
  3. 但是value还是强引用,所以如果不remove元素值还是会造成内存泄露

内存泄露的问题

因为只有键有加弱引用,可以使ThreadLocal外界无强引用时直接被GC。但是key还是强引用,所以需要手动remove

其它问题

  1. 虽然ThreadLocal是随着线程消亡,但如果使用线程池,那么就会被复用。因为线程池的原理就是复用线程

相关文章

  • 14-ThreadLocal类详细剖析

    ThreadLocal类详细剖析 对ThreadLocal的理解 JDK中的源码是这样描述ThreadLocal的...

  • ThreadLocal剖析

    ThreadLocal可以在多线程下实现各个线程的数据隔离 存储原理 直接看ThreadLocal的get()方法...

  • ThreadLocal源码剖析

    ThreadLocal源码剖析 ThreadLocal其实比较简单,因为类里就三个public方法:set(T v...

  • java多线程——ThreadLocal那些不为人知的细节

    今天我们来剖析一下ThreadLocal的源码。 说到ThreadLocal,我们在日常的开发工作中用的还是挺多的...

  • ThreadLocal源码剖析

    1.ThreadLocal概述 本文源码基于android 27。 1.1 简介 ThreadLocal提供了线程...

  • 深入剖析ThreadLocal

    概述 本文首发于个人技术博客[Java并发包学习七]解密ThreadLocal 相信读者在网上也看了很多关于Thr...

  • 深度剖析ThreadLocal

    概念 ThreadLocal是并发编程中的一种对象共享方式,从字面意思上看,我们大概能推断出它的用法是作为线程局部...

  • ThreadLocal源码剖析

    简述 ThreadLocal是用来解决共享对象的多线程访问问题的,一般情况下,通过ThreadLocal.set(...

  • ThreadLocal源码剖析

    每个线程都保持对其线程局部变量副本的隐式引用,只要线程是活动的并且 ThreadLocal 实例是可访问的。在线程...

  • ThreadLocal源码深入剖析

    一、简介  ThreadLocal 不知道大家有没有用过,但至少听说过,这篇文章主要讲解下ThreadLocal的...

网友评论

      本文标题:ThreadLocal剖析

      本文链接:https://www.haomeiwen.com/subject/emtophtx.html