ThreadLocal为每个线程提供了一个局部变量(ThreadLocalMap),ThreadLocalMap
用于存储每一个线程的变量的副本。
Thread类原码:
/* ThreadLocal values pertaining to this thread. This map is maintained
* by the ThreadLocal class. */
ThreadLocal.ThreadLocalMap threadLocals = null;
ThreadLocal常用的几个方法:get(),set(T value),remove()。
public T get() {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null) {
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null) {
@SuppressWarnings("unchecked")
T result = (T)e.value;
return result;
}
}
return setInitialValue();
}
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
public void remove() {
ThreadLocalMap m = getMap(Thread.currentThread());
if (m != null)
m.remove(this);
}
使用不当有可能发生内存泄露
当ThreadLocal对象被回收,但是相关线程还存活的时候(比如:线程池。线程跑完任务后,没有销毁),ThreadLocalMap的value值会一直存在,发生内存泄露。
解决办法:当前线程使用完 threadlocal 后,我们可以通过调用 ThreadLocal 的 remove 方法进行清除从而降低内存泄漏的风险。
网友评论