ThreadLocal源码

1、ThreadLocal可以通过为每个线程生成唯一的标识符,用于定位ThreadLocal中每个线程所保存的变量;

    public void set(T value) {
     //获得当前线程, Thread t = Thread.currentThread();
     //通过getMap方法获得实际每个线程自己存储key和value的Entry数组,即ThreadLocalMap变量;
     //可以理解为所有线程在TheadLocal中公用一个数组; ThreadLocalMap map = getMap(t); if (map != null)
       //this作为key,key通过key.threadLocalHashCode & (len-1);方式获得在数组中位置,
       //存在的话,替换value,日过
       //不存在的话,在指定数组位置新建Entry变量 map.set(this, value); else
       //如果ThreadLocalMap不存在,初始化一个长度为16的数组 createMap(t, value); }

需要重点注意,key是继承了WeakReference的若引用对象,value为强引用对象,因此value有可能一直删除,造成内存泄漏,

为方式value造成的内存泄漏可以,每次使用完remove。

如下代码:

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

            Entry(ThreadLocal k, Object v) {
                super(k);
                value = v;
            }
        }
    public T get() {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null) {
            ThreadLocalMap.Entry e = map.getEntry(this);
            if (e != null)
                return (T)e.value;
        }
     //当前线程存储的值是有可能为null的,即当前线程没有set过值 return setInitialValue(); }
原文地址:https://www.cnblogs.com/use-D/p/14147476.html