ThreadLoal深入分析

  1. ThreadLocal是能够实现变量在多线程直接的操作互不干扰,是属于线程内部的局部变量。
    那么它是如何做到的呢?
    在这里插入图片描述
    下面我们来分析源码。
1.0
    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;
    }

说明Thread中维护了ThreadLocalMap这个静态内部类,Entry是一个数组,也是map中的一个属性。
通过map可以拿到Entry[] ,然后通过key定义到数组的下标。

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

//set value 当map不为null。则单纯的通过步长,来找下一个位置,这就是解决冲突的过程
        private void set(ThreadLocal<?> key, Object value) {

            // We don't use a fast path as with get() because it is at
            // least as common to use set() to create new entries as
            // it is to replace existing ones, in which case, a fast
            // path would fail more often than not.

            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)]) {
                ThreadLocal<?> k = e.get();

                if (k == key) {
                    e.value = value;
                    return;
                }

                if (k == null) {
                    replaceStaleEntry(key, value, i);
                    return;[添加链接描述](https://www.cnblogs.com/tuyang1129/p/12713815.html)
                }
            }

            tab[i] = new Entry(key, value);
            int sz = ++size;
            if (!cleanSomeSlots(i, sz) && sz >= threshold)
                rehash();
        }


//为空,直接创建一个map,key为this也就是threadlocal,value为值
    void createMap(Thread t, T firstValue) {
        t.threadLocals = new ThreadLocalMap(this, firstValue);
    }

现在弄清楚了吧?线程操作变量时,实际上并没有对ThreadLocal进行修改,而时在Thread类中操作的!这也就是为啥能实现线程之间的操作,相互隔离。

如何还没懂?请参考:


版权声明:本文为weixin_44734394原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。