1、前言
我得为我之前的行为道歉,之前都是看别人的博客抄抄抄,结果抄了一波非重点的东西,也不知道啥意思。其实不管是学习还是写博客,最重要的是抓住重点,由重点来突破,对于理解知识会有很大的帮助。
2、原理
我们在使用 ThreadLocal 时,经常会这样使用:
private ThreadLocal<String> threadLocal = new ThreadLocal<>();
public void testThreadLocal(){
threadLocal.set("");
threadLocal.get();
}
使用 set 设置当前线程的数据,使用 get 获取当前线程设置的数据。
我们点进去 set、get 方法 方法发现:
// 放数据
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value); // 没有则创建一个 map
}
ThreadLocalMap getMap(Thread t) {
return t.threadLocals;
}
// 取数据
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 会新建一个 ThreadLocalMap,然后把值放进去,最后把 ThreadLocalMap 赋值给线程的 threadLocals;如果能从线程的 threadLocals 拿出 ThreadLocalMap 则拿出来,直接放值。ThreadLocalMap 的 key 为 ThreadLocal 自身,vaule 就是要放的值。
因为这个 ThreadLocalMap 封闭在不同的线程中,当然能做到线程安全。
所以这个问题很简单。。。。。。