线程范围内的共享数据:
java中封装了ThreadLocal类来很方便的实现线程范围内的共享数据
private T(){}
private static ThreadLocal<T> map = new ThreadLocal<T>();
public static T getThreadInstance(){
T instance = map.get();//当某个线程来取到T对象时,返回T对象
if(instance == null){//当某个线程来没有取到T对象时
instance = new T();//创建一个新的T
map.set(instance);//将该T类放到本地线程中
}
return instance;
}
其实ThreadLocal本身就是Map(内部封装了ThreadLocalMap),然后每一个线程来用Thread.currentThread()来保存key,T来保存value,所以当某个线程过来时就可以通过Thread的name来get相对应的value
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
public T get() {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null) {
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null)
return (T)e.value;
}
return setInitialValue();
}
然后如果在get中又取不到时又回去set
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;
}