以下内容是我自己的认识,可能有错。
ThreadLocal是用来存取线程共享变量的。而一个http请求,在java web里面,都是在一个线程里处理的(除非你自己手动创建新线程。ps:在AO、Manager、DAO里面,还是原来的线程吗?我该自己去测一下)。
可以用在一个实用类里面放一个静态ThreadLocal<T>,例如:
class Context {
private static ThreadLocal<Integer> holder = new ThreadLocal<Integer>();
public static Integer get() {
return holder.get();
}
public static void set(Integer value) {
holder.set(value);
}
}
在处理一个http请求时:你在servlet、filter里调用set,把需要存储的对象放进去。之后在调用get取出。另一个http请求的线程不会取到这个线程的对象。
ps:
每一个线程有一个ThreadLocalMap对象,它的key是一个ThreadLocal对象,它的值就是用户存进来的值。
当你调用Context.set(value1),就是以holder为key,以value1为值,存到当前线程的ThreadLocalMap对象里。
当你调用Context.get(),就是:以holder为key,从当前线程的ThreadLocalMap对象中取出value1。
这意味着,多个线程的ThreadLocalMap对象里面都有holer这个key,但value却是不同的。