ThreadLocal是Java提供的一种线程本地变量机制,它可以为每一个线程提供独立的变量副本,使得变量在每个线程中是隔离的,互不干扰。
ThreadLocal的主要功能有两个,第一个是实现资源对象的线程隔离,让每个线程各用各的资源对象,避免争用引发的线程安全问题,第二个是实现了线程内的资源共享。
ThreadLocal的原理:在TheadLocal内部维护了一个ThreadLocalMap类型的成员变量,用来存储资源对象,当我们调用set方法,就是以ThreadLocal自己作为key,资源对象作为value,放入当前线程的ThreadLocalMap集合中。 当调用get方法,就是以ThreadLocal自己作为key,到当前线程查询关联的资源值。 当调用remove方法,就是以ThreadLocal自己作为key,移除当前线程关联的资源值
ThreadLocal内存泄漏: ThreadLocal中的key是弱引用,它是被动的被GC调用释放key,不过只有key可以得到内存释放,而value因为是个强引用,value不会被释放。这样就会造成内存泄漏。在使用ThreadLocal 时都把它作为静态变量(即强引用),因此无法被动依靠 GC 回收,建议主动的remove 释放 key,这样就能避免内存溢出。