这里是开篇的标题
ThreadLocal是线程本地变量(每个线程都会有不同的值):
如:
//UI线程
booleanThreadLocal.set(true);
Log.d(TAG, "[Thread]booleanThreadLocal=" + booleanThreadLocal.get());
//新线程1
new Thread("Thread1") {
@Override
public void run() {
mBooleanThreadLocal.set(false);
Log.d(TAG, "[Thread1]booleanThreadLocal=" + booleanThreadLocal.get());
};
}.start();
//新线程2
new Thread("Thread2") {
@Override
public void run() {
Log.d(TAG, "[Thread2]booleanThreadLocal=" + booleanThreadLocal.get());
};
}.start();
日志如下所示:
D/TestActivity(8676):[Thread]booleanThreadLocal=true
D/TestActivity(8676):[Thread1]booleanThreadLocal=false
D/TestActivity(8676):[Thread2]booleanThreadLocal=null
通过上述代码可以发现booleanThreadLocal不同的线程获取到的值不同
接下来我们来看看ThreadLocal的源码
ThreadLocal的set方法:
public void set(T value) {
Thread t = Thread.currentThread();
//通过当前线程对象获取ThreadLocalMap
ThreadLocalMap map = getMap(t);
//以当前ThreadLocal为key保存value值到ThreadLocalMap中
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
void createMap(Thread t, T firstValue) {
t.threadLocals = new ThreadLocalMap(this, firstValue);
}
ThreadLocal的get方法:
public T get() {
Thread t = Thread.currentThread();
//通过当前线程对象获取ThreadLocalMap
ThreadLocalMap map = getMap(t);
if (map != null) {
//取出ThreadLocalMap中相应的value值
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null) {
@SuppressWarnings("unchecked")
T result = (T)e.value;
return result;
}
}
return setInitialValue();
}
private T setInitialValue() {
T value = initialValue();
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
return value;
}
protected T initialValue() {
return null;
}
总结:
每一个Thread中只有一个存数据的ThreadLocalMap对象(inheritableThreadLocals除外),
这一个ThreadLocalMap可以存很多以ThreadLocal对象为key,value为值的数据,
这样每一个Thread的每一个ThreadLocal得到分离