threadlocal

2019-02-18

https://juejin.im/post/59db31c16fb9a00a4843dc36

threadlocal_第1张图片
image.png

由于session与线程关联,而Tomcat这些web服务器多采用线程池机制,也就是说线程是可以复用的,所以在每次进入的时候都需要重新进行set操作,或者使用完毕以后及时remove掉!

 public void remove() {
         ThreadLocalMap m = getMap(Thread.currentThread());       
         if (m != null)       
             m.remove(this);
}

每个Thread中都存在一个map等待初始化,当设置一个ThreadLocal对象时,会把一个Entry存入map中,key为这个ThreadLocal变量,value为存储的值

    /**
     * Sets the current thread's copy of this thread-local variable
     * to the specified value.  Most subclasses will have no need to
     * override this method, relying solely on the {@link #initialValue}
     * method to set the values of thread-locals.
     *
     * @param value the value to be stored in the current thread's copy of
     *        this thread-local.
     */
    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)