前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ThreadLocal源码阅读

ThreadLocal源码阅读

作者头像
春哥大魔王
发布2018-04-17 17:48:20
6970
发布2018-04-17 17:48:20
举报

ThreadLocal平时用的比较多,通过将变量在每个线程放一个副本,避免了在多线程下对于变量的争抢。

ThreadLocal源码比较简单,整体了解起来比较容易。

ThreadLocalMap

    static class ThreadLocalMap {

ThreadLoca维护了内部类ThreadLocalMap。

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();
    }

    ThreadLocalMap getMap(Thread t) {        return t.threadLocals;
    }

ThreadLocal.ThreadLocalMap threadLocals = null;

可以发现通过线程获取一个ThreadLocalMap,而值的获取通过this(就是ThreadLocal)获取一个Entry。

set方法

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

        ThreadLocalMap(ThreadLocal<?> firstKey, Object firstValue) {
            table = new Entry[INITIAL_CAPACITY];            int i = firstKey.threadLocalHashCode & (INITIAL_CAPACITY - 1);
            table[i] = new Entry(firstKey, firstValue);
            size = 1;
            setThreshold(INITIAL_CAPACITY);
        }

数据放在ThreadLocalMap中,key是ThreadLocal。

remove方法

     public void remove() {
         ThreadLocalMap m = getMap(Thread.currentThread());         if (m != null)
             m.remove(this);
     }        private void remove(ThreadLocal<?> key) {
            Entry[] tab = table;            int len = tab.length;            int i = key.threadLocalHashCode & (len-1);            for (Entry e = tab[i];
                 e != null;
                 e = tab[i = nextIndex(i, len)]) {                if (e.get() == key) {
                    e.clear();
                    expungeStaleEntry(i);                    return;
                }
            }
        }

ThreadLocal核心代码就这么多吧,主要关注下里面的Entry,ThreadLocalMap。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-01-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 春哥talk 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ThreadLocalMap
  • get方法
  • set方法
  • remove方法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档