ThreadLocal是一个基于线程的全局变量存放点,即一个线程内ThreadLocal得到的Obj都是同一个
原理代码:
代码清单1 SimpleThreadLocal
public class SimpleThreadLocal {
private Map valueMap = Collections.synchronizedMap(new HashMap());
public void set(Object newValue) {
valueMap.put(Thread.currentThread(), newValue);①键为线程对象,值为本线程的变量副本
}
public Object get() {
Thread currentThread = Thread.currentThread();
Object o = valueMap.get(currentThread);②返回本线程对应的变量
if (o == null && !valueMap.containsKey(currentThread)) {③如果在Map中不存在,放到Map
中保存起来。
o = initialValue();
valueMap.put(currentThread, o);
}
return o;
}
public void remove() {
valueMap.remove(Thread.currentThread());
}
public Object initialValue() {
return null;
}
}
实际上是全局有一个Hash表,通过线程作为Key,来存放和得到指定值
使用方法:
定义一个全局静态变量,存放ThreadLocal,实际上就是定义了全局的Hash表
private static ThreadLocal<Object> connThreadLocal = new ThreadLocal<Object>();
需要使用的地方:
connThreadLocal.get()
connThreadLocal.set(object)
注意,第一次get会是null
按照原理代码,理论上,一个程序内可以存在任意多个ThreadLocal对象,他们可以独立工作,都是按照线程ID作为Key来存取的Hash表
TheadLocal的典型应用分析:
1. b/s项目,在action等场所,能够通过session来读取存放登录用户等信息,但是如果用到了后台处理程序,可能就无法访问request来得到session,这种应用,如果将全局存放的东西存放到ThreadLocal,那么,其他任何地方都可以访问得到
当然,需要在Action的入口,将信息从session读取,存放到ThreadLocal里面