一 ThreadLocal介绍
ThreadLocal是一个线程的内部存储类,可以在每个线程的内部存储数据。同一个ThreadLocal对象,在不同的线程中可以保存不同的对象。
二 实现原理:
ThreadLocal的set()方法源码:
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
ThreadLocal的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();
}
ThreadLocal的remove()方法源码:
public void remove() {
ThreadLocalMap m = getMap(Thread.currentThread());
if (m != null)
m.remove(this);
}
ThreadLocalMap源码:
static class ThreadLocalMap {
static class Entry extends WeakReference<ThreadLocal<?>> {
/** The value associated with this ThreadLocal. */
Object value;
//以TheadLocal为key
Entry(ThreadLocal<?> k, Object v) {
super(k);
value = v;
}
}
private Entry[] table;
}
三 应用实例:
final ThreadLocal<String> threadLocal = new ThreadLocal<>();
final ThreadLocal<String> threadLocal1 = new ThreadLocal<>();
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
threadLocal.set("1");
threadLocal1.set("");
threadLocal.set("2");
threadLocal.get();
threadLocal.remove();
}
});
thread.start();