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; }
今天先复习到这