提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
ThreadLocal源码解读
前言
ThreadLocal主要作用:
1.保证线程安全;
2.在线程级别传递变量。
一、ThreadLocal原理
ThreadLocal并不维护ThreadLocalMap,也不是存储数据的容器,它只是相当于一个工具类,提供了操作该容器的方法,get,set,remove等。而ThreadLocal内存类ThreadLocalMap才是存储数据的容器,并且该容器由Thread维护。二、ThreadLocal源码
主要包含3个方法
1. public void set(T value)
设置当前线程的线程局部变量值
代码如下(示例):
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
2. public T get()
返回当前线程对应的线程局部变量
代码如下(示例):
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();
}
3. public void remove()
删除当前线程局部变量,主要为了减少内存的占用。
代码如下(示例):
public void remove() {
ThreadLocalMap m = getMap(Thread.currentThread());
if (m != null)
m.remove(this);
}
三、总结
ThreadLocal如果使用不当可能造成 1.脏数据; 2.内存泄露。 特别是使用线程池的时候,由于线程会被复用,Thread类的成员变量ThreadLocals也会被复用。所以
1.显示的调用remove()方法;
2.下次调用set,get,remove方法时,程序会清除ThreadLocalMap里所有key为
null的value。