首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

struts2请求处理进程源代码分析(2)

2013-04-07 
struts2请求处理过程源代码分析(2)public class ThreadLocalT {public T get() {Thread t Thread.curr

struts2请求处理过程源代码分析(2)
public class ThreadLocal<T> { 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(); } public void set(T value) { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) map.set(this, value); else createMap(t, value); } ThreadLocalMap getMap(Thread t) { return t.threadLocals; } void createMap(Thread t, T firstValue) { t.threadLocals = new ThreadLocalMap(this, firstValue); } 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; } protected T initialValue() { return null; } . . . //省略}

1.先看set()方法。利用Thread.currentThread()返回当前线程,然后以当前线程为参数调用getMap()返回当前线程的局部变量(Thread的threadLocals属性)。if (map != null)局部变量存在,通过map.set(this, value)将值存入。this是当前的ThreadLocal实例,value是存入局部变量的值。可以看到ThreadLocal这里是作为了map的key值,这样不同的ThreadLocal实例获得的值是不同的,这样就是为什么一般ThreadLocal都会定义成静态的。所以从这个角度可以理解为:每个ThreadLocal都是当前线程的一个局部变量。另外,如果局部变量不存在时,通过createMap()方法为当前线程创建个ThreadLocal.ThreadLocalMap实例,并赋值给当前线程的threadLocals属性。

?

2.get()方法其实就是set的逆过程,就不说了。但其中的setInitialValue()方法看下,它的作用是初始化局部变量,当当前线程的局部变量存在时,将当前的ThreadLocal下的值置null,initialValue()方法只是返回个null;当当前线程的局部变量不存在时,创建个,并将当前的ThreadLocal下的值置null。


其实,在早期的jdk版本中ThreadLocal并非是这样实现,Thread中并没有threadLocals属性,而是通过在ThreadLocal中维护一个Map,Map的key值就是当前线程,value值就是我们要存入的值。

?

?


?

热点排行