ThreadLocal的特点:实现线程间的资源隔离,实现线程内的资源共享
2.原理是,每个线程都有一个ThreadLocalMap类型的成员变量,用来储存资源对象
1.调用set方法,就是以ThreadLocal自己作为key,资源对象作为value,放入当前线程池的threadLocalMap集合中
2.调用get方法,就是以ThreadLocal自己作为key,到当前中查找关联线程的资源值
3.调用remove方法,就是以ThreadLocal自己作为key,移除关联线程的资源值
3.为什么ThreadLocal中的key要设计为弱引用?
1.Thread可能需要长时间的运行(如线程池中的线程),如果key不再使用,需要在内存不足的时候释放其所占用的内存
2.在GC时候仅是将key的内存释放,后续还要根据key是否为null来进一步释放值的内存,释放时机有:
1.获取key的值发现为null key
2. set key 时会使用启发式扫描,清除邻近的null key ,启发次数与元素个数,是否发现null key有关
3.remove时(推荐),因为一般使用ThreadLocal时都把他作为静态变量,因此GC无法回收
所以清理内存时,只能使用remove,前两种方法无法使用,如果使用前两种方法的话,不去执行remove操作,如果存在不被利用的内存,无法进行清理,内存积累越来越多,造成内存溢出。