ThreadLocal类可以为每个线程内部分配变量。保证各个线程之间的变量相互独立。
基本用法:
public class TestThreadLocal {
static class MyThread implements Runnable{
private ThreadLocal<Integer> threadLocal = new ThreadLocal<>();
@Override
public void run() {
for(int i=0;i<10;i++){
threadLocal.set(i);
System.out.println(Thread.currentThread().getName()+":"+threadLocal.get());
}
}
}
public static void main(String[] args) {
Thread thread1 = new Thread(new MyThread(),"线程A");
Thread thread2 = new Thread(new MyThread(),"线程B");
thread1.start();
thread2.start();
}
}
方法:
- T get() 获取当前线程的ThreadLocal值
- void set(T value) 设置当前线程的ThreadLocal值
- T initialValue() 设置当前线程ThreadLocal的初始值
- void remove() 删除与当前线程关联的ThreadLocal值
源码解析:
//get()方法
public T get() {
Thread t = Thread.currentThread();
//获取当前线程的 ThreadLocalMap对象
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();
}
ThreadLocalMap类有一个静态内部类Entry
static class Entry extends WeakReference<ThreadLocal<?>> {
/** The value associated with this ThreadLocal. */
Object value;
Entry(ThreadLocal<?> k, Object v) {
super(k);
value = v;
}
}
ThreadLocalMap类有一个Entry[] table属性,用来存放<ThreadLocal k,Object v>类型的Entry。
Entry的k对应每个线程中的ThreadLocal,value对应ThreadLocal中set()方法设置的值。