ThreadLocal为列表添加对象的流程如下图所示,我们将按照下面的流程分析ThreadLocal列表添加对象的流程。
下面是我们演示ThreadLocal设置并获取对象列表的代码。
public class ThreadLocal2 {
//volatile static Person p = new Person();
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 = "zhangsan";
}
}
运行的结果,我们发现t1的结果居然是空,这是为什么呢?
进入ThreadLocal.set方法。
ThreadLocal.getMap返回的是当前线程对应的map,所以T1拿不到T2的数据。