垃圾回收:
在Thread里面有个ThreadLocalMap对象,ThreadLocalMap里面的EnTry继承了WeakReference<ThreadLocal>,垃圾回收的核心就在这个WeakReference。当CurrentThread销亡以后,ThreadLocalMap自然也会被回收,这个是很容易理解的。同时因为这里的EnTry继承了一个弱引用,当作为key的ThreadLocal被回收以后其在EnTry对应的值也会被回收。之前在想如果线程固定ThreadLocal频繁生死的时候会不会出现内存溢出的问题,事实证明即使这样也不会有内存溢出的问题,当然我想的这种情况在现实中应该也不会用到。

与同步对比:
Synchronized实现线程间的数据共享,而ThreadLocal则用于线程间的数据隔离。

实例:

public class EnvUtils {
    public static Env getEnv() {
        return threadLocal.get();
    }

    public static void removeEnv() {
        threadLocal.remove();
    }

    private static ThreadLocal<Env> threadLocal = new ThreadLocal<Env>() {
        @Override
        protected Env initialValue() {
            return new Env();
        }
    };

}