ThreadLocal 多线程

ThreadLocal就是为当前线程保存变量副本的。
1 ThreadLocal.set(value):咋一看是向ThreadLocal设值,其实ThreadLocal会把值存到当前线程(Thead.currentThead)的一个ThreadLocalMap变量中。
2 ThreadLocal.get():则是通过ThreadLocal以自己为key到Thead.currentThead的ThreadLocalMap里取到相应的值。
请看源码
set
public void set(T value) {
   Thread t = Thread.currentThread();//获取当前线程
   ThreadLocalMap map = getMap(t);//获取当前线程的ThreadLocalMap
   if (map != null)
    map.set(this, value);//往当前线程的ThreadLocalMap设置Key就threadlocal
   else
     createMap(t, value);
}


同样get 也是把自己(ThreadLoal)当成key去当前线程的ThreadLocalMap中去取值。
  public T get() {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);//获取当前线程的ThreadLocalMap
        if (map != null) {
            ThreadLocalMap.Entry e = map.getEntry(this);
            if (e != null)
                return (T)e.value;
        }
        return setInitialValue();
    }

也就是说当前线程销毁的时候 通过ThreadLocal set的值也就不存在了。所以就算线程再多也不会对ThreadLocal造成压力。当然你也可以手动调用remove方法删除。

但是对于web应用,比如tomcat服务器。由于tomcat维护者自己的线程池。而且它的线程用完就置于空闲状态,而不会销毁。所以不同的请求可能会是同一个线程,因此从ThreadLocal得到的变量就是一样的。 如果存在对ThreadLocal保存的变量的读写操作就需要注意了。每次用完就remove掉。不然两次拿出来的是同一个变量,当然如果不存在读写操作,仅仅是获取实例对象。是不会存在线程问题的。

你可能感兴趣的:(多线程,thread,tomcat,应用服务器,Web)