说句玩笑话,关于ThreadLocal 分析的视频是认真做的吗?
关于set方法和get方法的顺序问题,视频先介绍的set方法

视屏并未说明为何3个ThreadLocalMap中的Number为何不是同一个对象?因为我们要保证的ThreadLocalMap 键值对对象中的value值为不同的?实际上传入的value对象才是关键吧。
此set方法只是展示了:将value设置到自己线程的ThreadLocalMap键值对中,其中key为线程对象本身,值为value对象;但是并不能判断对象(图示中的number为不同的对象)
2.实际上set方法之所以设置的value为不同的对象,是因为get方法,

视频中分析的get方法通过线程对象得到value 而get方法源码为:
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();
}
正是由于第一次执行get方法时,ThreadLocalMap map = getMap(t);中map为null
所以执行 return setInitialValue();其中setInitialValue()方法源码为:
private T setInitialValue() {
T value = initialValue();
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
return value;
}
是因为第一次执行setInitialValue()方法时,返回的是执行 ,T value = initialValue();中value的值
而 initialValue()方法是我们自己实现的;
也就是说,每个ThreadLocalMap键值对的值的初始值(对象),都是通过initialValue()方法新创建不同对象。因为是不同的对象,但是状态相同,所以才有每个副本的值相同吧.
所以视频的源码分析是故意没讲完全?