ThreadLocal原理解析

2019-10-24  本文已影响0人  后来丶_a24d

目录

目录.png

简介

get()方法源码

 public T get() {
        //1、获取当前线程
        Thread t = Thread.currentThread();
        //2、 获取当前线程的ThreadLocalMap 对象
        ThreadLocalMap map = getMap(t);
        if (map != null) {
            //3、map不为空,则以当前 ThreadLocal 对象实例作为key值,去map中取值,有找到直接返回
            ThreadLocalMap.Entry e = map.getEntry(this);
            if (e != null) {
                @SuppressWarnings("unchecked")
                T result = (T)e.value;
                return result;
            }
        }
        //4. map 为空或者在map中取不到值,那么走这里,返回默认初始值, 如果涉及null key会清理以防止内存泄露
        return setInitialValue();
    }

set() 方法源码

public void set(T value) { 
        //1. 取当前线程对象
        Thread t = Thread.currentThread();
        //2. 取当前线程的数据存储容器
        ThreadLocalMap map = getMap(t);
        if (map != null)
        //3. 如果map不为空,以当前ThreadLocal实例对象为key,存值
            map.set(this, value);
        else
        //4. 如果map为空,新建一个当前线程的数据存储容器
            createMap(t, value);
    }

ThreadLocal为什么会内存泄漏

static class Entry extends WeakReference<ThreadLocal<?>>

ThreadLocalMap中的Entry的key设计成弱引用的原因


ThreadLocalMap中的Entry的value是强引用的原因


参考文献

上一篇 下一篇

猜你喜欢

热点阅读