Discuss / Java / 重新看一遍,感觉跟没学过一样,好喜欢这种知识从大脑穿过,却不留痕迹的感觉。

重新看一遍,感觉跟没学过一样,好喜欢这种知识从大脑穿过,却不留痕迹的感觉。

Topic source

Loading...

#1 Created at ... [Delete] [Delete and Lock User]

为了在每一个线程的每一个任务中都能拿到当前用户信息。我们在新建线程的时候为每一个线程创建了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关联的实例互不干扰。


  • 1

Reply