ThreadLocal,线程局部变量,每个线程单独一份。
实现原理: 线程实例Thread中保存了一份map对象,该map对象以ThreadLocal为key, ThreadLocal保存的值为value。保证了每个线程都单独一份。 这个map是属于ThreadLocal 中定义的static class。
该map:散列表,与HashMap的实现不同,不是使用的链接法来处理碰撞。同时请注意,map中的entry是extends WeakRefeance,这样实现的目的,是为了进一步防止内存泄漏,但是这种防止,只能对ThreadLova变量的释放起到作用,对value不生效。
protected void initialValue(T value); 提供初始值
get();
set();内存泄漏:
ThreadLocal 会有内存泄漏的风险存在。
for example:(1)对于ThreadLocal,外部调用完后,实例超出作用域,再加上 设置的weakReference,可回收,但是对于entry中的value来说,entry一直指向它,属于强引用。
所以才有了ThreadLocal中的set、get方法的不同处理。
每次在循环查找时,都在判断了e.key == key 不成立之后,if (e.key==null),用于回收掉e.key==null的entry。