ThreadLocal类的一些个人理解

最近面试,可以说五花八门,问的乱七八糟,我的内心也是细碎,怎么叫技术好?我顿时有点迷茫了。吐槽一下而已!
把一些重要的知识点重新复习一下写在这里。
先从此类的设计角度来说吧。
多线程资源共享的有两种解决方案
第一种:空间换时间--------空间即内存,在每个线程内存放一个该资源副本,保证数据的一致性。
第二种:时间换空间--------Synchronized 加锁机制,保证数据的一致性。
大体上源代码是一下这样
public class ThreadLocal<T> {

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

    }
    // 提出为单例模式   
    private T setInitialValue() {
        T value = initialValue();
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null) {
            map.set(this, value);
        } else {
            createMap(t, value);}
        return value;
    }

    void createMap(Thread t, T firstValue) {
        t.threadLocals = new ThreadLocalMap(this, firstValue);
    }
    // 静态内部类的设计 妙处在于所有ThreadLocal实例共享一个ThreadLocalMap   
    static ThreadLocalMap {
        private Entry[] table;
    }


}

通过上述代码我们会发现一个线程只会存在ThreadLocalMap实例,并且是一个懒加载的单例模式。而且该Map的key是ThreadLocal实例本身,而value是initialValue方法设置的对象

    // 此方法提供了threadlocal的初始化
    protected T initialValue() {
        return null;
    }
今天先复习到这


posted on 2020-12-15 19:04  剑姬  阅读(107)  评论(0编辑  收藏  举报

导航