Java-Interview-Summary
Java-Interview-Summary copied to clipboard
关于内容中ThreadLocal原理的错误描述
摘抄了你的描述如下: ThreadLocal 常用于维护线程私有化变量,解决线程安全问题。其内部维护了一个 ThreadLocalMap,使用 Thread 作为 key,ThreadLocal.set 的值作为 value。
纠正如下: Thread中维护一个ThreadLocalMap,该Map的key为ThreadLocal实例,value为对应set的值。 当获取ThreadLocal中的值时:获取当前线程的ThreadLocalMap,以当前ThreadLocal实例为key ,get出所存储的值。 ps:这里会有个坑,因为ThreadLocalMap中用Entity具体实现,Entity继承WeakReference<T>。所以key值ThreadLocal<?> 采用的是弱引用。所以再GC时会被回收。当回收后Map中的大量value数据无发被remove,且valud存在强引用,导致内存溢出。不过ThreadLocal再remove时增加了一个处理,remove会check所有key为null的,将value赋值为null。