为了在每一个线程的每一个任务中都能拿到当前用户信息。我们在新建线程的时候为每一个线程创建了ThreadLocal对象把用户信息绑定到ThreadLocal上。
public void run() { new ThreadContext(this.u); new T1().process(); new T2().process(); new T3().process(); }
但是在创建ThreadLocal对象userContext的时候我们发现他是一个静态变量,众所周知,每个类只维护一份静态变量。
那我每次run创建ThreadLocal对象的时候new ThreadContext(this.u);新的用户信息不会把原来的覆盖掉吗?
static public ThreadLocal<String> userContext = new ThreadLocal<>(); public ThreadContext(String user) { userContext.set(user); }
查看ThreadLocal的源码可知,这小子原来是先获取当前线程,再在当前线程上绑定用户信息。
public void set(T value) { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) map.set(this, value); else createMap(t, value); }
也就是廖大教程中所说的这一段话
实际上,可以把ThreadLocal看成一个全局Map<Thread, Object>:每个线程获取ThreadLocal变量时,总是使用Thread自身作为key:
Object threadLocalValue = threadLocalMap.get(Thread.currentThread());
因此,ThreadLocal相当于给每个线程都开辟了一个独立的存储空间,各个线程的ThreadLocal关联的实例互不干扰。
Sign in to make a reply
Loading...
为了在每一个线程的每一个任务中都能拿到当前用户信息。我们在新建线程的时候为每一个线程创建了ThreadLocal对象把用户信息绑定到ThreadLocal上。
但是在创建ThreadLocal对象userContext的时候我们发现他是一个静态变量,众所周知,每个类只维护一份静态变量。
那我每次run创建ThreadLocal对象的时候new ThreadContext(this.u);新的用户信息不会把原来的覆盖掉吗?
查看ThreadLocal的源码可知,这小子原来是先获取当前线程,再在当前线程上绑定用户信息。
也就是廖大教程中所说的这一段话
实际上,可以把ThreadLocal看成一个全局Map<Thread, Object>:每个线程获取ThreadLocal变量时,总是使用Thread自身作为key:
Object threadLocalValue = threadLocalMap.get(Thread.currentThread());
因此,ThreadLocal相当于给每个线程都开辟了一个独立的存储空间,各个线程的ThreadLocal关联的实例互不干扰。