ThreadLocal是Java提供的用来存储线程独立的数据,那当我们使用这个类时,他的数据存在哪里了呢,请看下面的代码
private void threadLocalDemo(){
ThreadLocal<String> stringThreadLocal = new ThreadLocal<>();
stringThreadLocal.set("测试");
String a = stringThreadLocal.get();
}
在上述代码中我们创建了一个ThreadLocal对象,并且调用了他的set方法,保存了一个String数据,接着我们看下ThreadLocal的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方法我们知道,ThreadLocal对象把当前Thread做为key获取了一个叫做ThreadLocalMap的对象,然后把数据存在了这个Map的数组中了,所以当我们在使用ThreadLocal保存数据时,保存数据的Map应该和当前线程有关,接着我们看下getMap方法
ThreadLocalMap getMap(Thread t) {
return t.threadLocals;
}
这个方法很简单,直接通过thread.threadlocals返回了,所以我们通过ThreadLocal保存的数据应该是保存到了当前线程的成员变量中了。其中Thread、ThreadLocalMap和ThreadLocal的关系如下,