一个很奇怪的问题:为什么从threadlocal中取数据的时候是null
class MyThreadLocalData3 {
private MyThreadLocalData3() {
}
// 线程共享
private static ThreadLocal<MyThreadLocalData3> threadLocal = new ThreadLocal<MyThreadLocalData3>();
private static MyThreadLocalData3 instance=null;
public static MyThreadLocalData3 getThreadInstance() {
if (instance == null) {
synchronized (threadLocal) {
if (instance == null) {
instance = new MyThreadLocalData3();
threadLocal.set(instance);
}
}
}
return threadLocal.get();
}
}
public class ThreadLocal2 {
public static void main(String[] args) {
final List<MyThreadLocalData3> list=new ArrayList<MyThreadLocalData3>();
MyThreadLocalData3 data1= MyThreadLocalData3.getThreadInstance();
MyThreadLocalData3 data2= MyThreadLocalData3.getThreadInstance();
list.add(data1);
list.add(data2);
new Thread(){
@Override
public void run() {
System.out.println(list.size()); // 2
MyThreadLocalData3 data3= MyThreadLocalData3.getThreadInstance();
list.add(data3);
System.out.println(data3); // data3为什么是 null值???????
System.out.println(list.size()); // 3
}
}.start();
// 主线程睡眠3s,保证子线程执行完毕
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// list里的第一个和第二个是同一个线程里,从threadlocal取到的对象,所以相等
System.out.println(list.get(0) == list.get(1)); // true
// 不同线程里的两个对象
System.out.println(list.get(1) == list.get(2)); // false
System.out.println(list.get(1)); // 有值
System.out.println(list.get(2)); // null??????????????????????????????????????????????
}
}