ThreadLocal 是什么?
先看下代码:
static ThreadLocal<Person> tl = new ThreadLocal<>();
public static void main(String args[]){
new Thread(()->{
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(tl.get());
}).start();
new Thread(()->{
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
tl.set(new Person());
}).start();
}
static class Person{
String name = "xxx";
}
上面代码2个线程同时操作一个ThreadLocal 对象:
第一个线程2秒钟后读取tl
第二个线程1秒钟set一个person对象到tl
按道理来说,第一个线程应该可以get到对象。
但是实际情况是返回null。
为什么呢?
我们需要看ThreadLocal 对象的 set方法 源码解析
class ThreadLocal{
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
ThreadLocalMap getMap(Thread t) {
return t.threadLocals;
}
}
class Thread{
ThreadLocal.ThreadLocalMap threadLocals = null;
}
ThreadLocal的set方法里获取到了 一个 ThreadLocalMap对象,
而这个ThreadLocalMap 来自于当前线程对象的 threadLocals
然后再把 ThreadLocal当做key,new Person() 当作值 保存在当前线程的
ThreadLocalMap 中。
所以,不同线程操作同一个ThreadLocal是完全不相干的。