ThreadLocal源码解析
JDK源码如是说:
ThreadLocal类用来提供线程内部的局部变量。这种变量在多线程环境下访问(通过get或set方法访问)时
能保证各个线程里的变量相对独立于其他线程内的变量。ThreadLocal实例通常来说都是private static类型的,
用于关联线程和线程的上下文。
1、内部存储元素采用ThreadLocalMap,其内部
1.1、Entry继承WeakReference<ThreadLocal<?>>,
方便垃圾回收key。每次get()——>getEntry()——>getEntryAfterMiss——>expungeStaleEntry删除key为null的值。
1.2、使用ThreadLocal作为key,减少Entry的key数量,提高性能。
2、使用时,继承
protected T initialValue() {
return null;
}
添加需要返回的对象。
建议将ThreadLocal变量定义成private static的,这样的话ThreadLocal的生命周期就更长,由于一直存在ThreadLocal的强引用,所以ThreadLocal也就不会被回收,也就能保证任何时候都能根据ThreadLocal的弱引用访问到Entry的value值,然后remove它,防止内存泄露。
ps:ThreadLocal中对象只是当前线程存储在map中的副本。