美文网首页
ThreadLocal

ThreadLocal

作者: 颓废骚年 | 来源:发表于2020-07-21 17:40 被阅读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 方法进行清除从而降低内存泄漏的风险。

    相关文章

      网友评论

          本文标题:ThreadLocal

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