ThreadLocal

2020-07-21  本文已影响0人  颓废骚年

ThreadLocal为每个线程提供了一个局部变量(ThreadLocalMap),ThreadLocalMap
用于存储每一个线程的变量的副本。

Thread类原码:
    /* ThreadLocal values pertaining to this thread. This map is maintained
     * by the ThreadLocal class. */
    ThreadLocal.ThreadLocalMap threadLocals = null;
ThreadLocal常用的几个方法:get(),set(T value),remove()。
    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();
    }

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

     public void remove() {
         ThreadLocalMap m = getMap(Thread.currentThread());
         if (m != null)
             m.remove(this);
     }
使用不当有可能发生内存泄露

当ThreadLocal对象被回收,但是相关线程还存活的时候(比如:线程池。线程跑完任务后,没有销毁),ThreadLocalMap的value值会一直存在,发生内存泄露。
解决办法:当前线程使用完 threadlocal 后,我们可以通过调用 ThreadLocal 的 remove 方法进行清除从而降低内存泄漏的风险。

上一篇下一篇

猜你喜欢

热点阅读