ThreadLocal可以实现【资源对象】的线程隔离,让每一个线程各用各的【资源对象】,避免争用引发线程安全问题。
ThreadLocal同时实现了在线程内是资源共享的
其原理是,每一个线程内有一个ThreadLocalMap类型的成员变量用来存储资源对象
调用set方法,就是以ThreadLocal自己作为key,资源对象作为Value,放入当前线程的ThreadLocalMap集合中
调用get方法就是以ThreadLoacl自己作为key,到当前的线程中找关联的资源的值
调用remove方法,就是以ThreadLocal自己作为key,移除当前线程关联的资源值
为什么ThreadLocalMap中的key(即ThreadLocal)要设计为弱引用?
Thread可能需要长时间运行,(如果是线程池中的线程)如果key不再使用,需要在内存不足(GC)时释放其占用的内存
但是GC仅是让key的内存释放,后续还要根据key是否为null来进一步释放值内存,释放时机有
获取key发现null key
set key时,会使启发式扫描,清除临近的null key,启发次数与元素个数,是否发现null key有关。
remove时(推荐),因为一般使用ThreadLocal时都把它作为静态变量,因此GC无法回收。