美文网首页
ThreadLocal

ThreadLocal

作者: 白马王朗 | 来源:发表于2018-01-24 00:55 被阅读0次

Thread

同一个变量在多线程访问的环境下,可能出现线程安全的问题。ThreadLocal通过创建线程副本的方式保证安全;

查看Thread类中存在:

ThreadLocal.ThreadLocalMap threadLocals = null;

从这里就可以看到,这个threadLocals 其实存储的就是当前线程所持有的变量;

ThreadLocal

static class ThreadLocalMap {
        static class Entry extends WeakReference<ThreadLocal<?>> {
            Object value;
            Entry(ThreadLocal<?> k, Object v) {
                super(k);
                value = v;
            }
        }
        ...
}

ThreadLocal类中存在一个内部类:ThreadLocalMap ,和我们常用的Map极其相似,内部数据结构是继承WeakReference的Entry结构。
WeakReference:http://blog.csdn.net/zmx729618/article/details/54093532

具体实现

  • get方法:
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();
    }
  • set方法:可以看到这里很巧妙的将当前对象(this)设置为key值。
public void set(T value) {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
    }

内存泄漏

http://mp.weixin.qq.com/s/5gkK_dwDPAOrtHYSLsQzUA

相关文章

网友评论

      本文标题:ThreadLocal

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