前言
TheadLocal
主要用于将似有线程和该线程存放的副本对象做一个映射,是的线程之间互不影响。
它为当前执行线程提供了一个副本,用于保存对象。使得线程之间都互不干扰。
结构
- 每个Thread内部都有一个Map
Map里面存储线程本地对象(key)和线程的变量副本(value)
使用
private static class NameHolder {
public static ThreadLocal<String> LOCAL = new ThreadLocal<>();
public static void set(String name) {
LOCAL.set(name);
}
public static String get() {
return LOCAL.get();
}
public static void remove() {
LOCAL.remove();
}
}
建议:
- 尽量采取一个单独的类来保存
TheadLocal
。 - 使用
public static
进行修饰。
源码
TheadLocal 保存来自于Thead对象。
public class Thread implements Runnable {
ThreadLocal.ThreadLocalMap threadLocals = null;
}
TheadLocal核心主要有get、set、remove方法。
public class ThreadLocal<T> {
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);
}
}