ThreadLocal 叫做 线程局部变量
在详细解释之前 先看一段代码
public class ThreadLocalTest { private static ThreadLocal<Integer> intThreadLocal = new ThreadLocal<Integer>(); public static void main(String[] args) { for (int i = 0; i < 2; i++) { new Thread(new Runnable() { @Override public void run() { int data = new Random().nextInt(10000); System.out.println(Thread.currentThread().getName() + " add data :" + data); intThreadLocal.set(data); System.out.println(Thread.currentThread().getName() + " " + intThreadLocal.get()); } }).start(); } }
运行结果如下
可以看到每个Thread都是自己设置进去的那个值,相互不影响
ThreadLocal有两个比较重要的方法
get() set()
下面我们细看一下 get()
public T get() { //获取当前线程 Thread t = Thread.currentThread(); //获取到当前线程的ThreadLocalMap对象,每个线程都有一个 ThreadLocalMap map = getMap(t); if (map != null) { //不为空 就把ThreadLocal作为key 获取对应的值 ThreadLocalMap.Entry e = map.getEntry(this); if (e != null) { @SuppressWarnings("unchecked") T result = (T)e.value; return result; } } return setInitialValue(); //为空 就初始化 }
下面我们细看一下 set()
//map不为空 将值设置进线程的 ThreadLocal中。为空就new一个 public void set(T value) { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) map.set(this, value); else createMap(t, value); }
总结:
1 ThreadLocal 不是用来解决共享对象的多线程访问问题的,
一般情况下,通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象(新new出来的对象),其他线程是不需要访问的,也访问不到的。
倘若都设置的同一个对象 依然会有线程安全问题。
2 若多个线程之间需要共享资源,以达到线程间的通信时,就使用同步机制;若仅仅需要隔离多线程之间的关系资源,则可以使用ThreadLocal。