怎么分析呢?我们就直接先以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();
}
从此处我们可以简单看出是采用类似Map的方式,采用Key-Value方式实现数据的存储的,而Key则是当前的线程
我们来看一下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;
}
从map.set(this, value)
中我们看出的确是采用Map存储方式,
接着我们看一下怎么创建的Map
void createMap(Thread t, T firstValue) {
t.threadLocals = new ThreadLocalMap(this, firstValue);
}
至此我们看到内部采用的是一个ThreadLocalMap作为数据存储容器,Thread作为Key来实现数据的共享存储,从而实现当前数据多线程共享(至于ThreadLocalMap内部我们不去深究)
网友评论