Thread
同一个变量在多线程访问的环境下,可能出现线程安全的问题。ThreadLocal通过创建线程副本的方式保证安全;
查看Thread类中存在:
ThreadLocal.ThreadLocalMap threadLocals = null;
从这里就可以看到,这个threadLocals 其实存储的就是当前线程所持有的变量;
ThreadLocal
static class ThreadLocalMap {
static class Entry extends WeakReference<ThreadLocal<?>> {
Object value;
Entry(ThreadLocal<?> k, Object v) {
super(k);
value = v;
}
}
...
}
ThreadLocal类中存在一个内部类:ThreadLocalMap ,和我们常用的Map极其相似,内部数据结构是继承WeakReference的Entry结构。
WeakReference:http://blog.csdn.net/zmx729618/article/details/54093532
具体实现
- 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();
}
- set方法:可以看到这里很巧妙的将当前对象(this)设置为key值。
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
网友评论