ThreadLocal 是什么?

在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。
ThreadLocal并不是一个Thread,而是Thread的局部变量,也许把它命名为ThreadLocalVariable更容易让人理解一些。
在JDK5.0中,ThreadLocal已经支持泛型,该类的类名已经变为ThreadLocal。API方法也相应进行了调整,新版本的API方法分别是void set(T value)、T get()以及T initialValue()。

源码分析

结构

  1. Thread 类中有个 ThreadLocal.ThreadLocalMap threadLocals = null; 变量。
  2. ThreadLocal.ThreadLocalMap 有个 ThreadLocal.ThreadLocalMap.Entry 数组
  3. ThreadLocal.ThreadLocalMap.Entry 键是ThreadLocal 值是value

    代码

  4. 读取ThreadLocal的值,

    1. 先拿到当前thread的map
    2. 从map中查找当前threadlocal的值
    3. 找不到就初始化,然后返回
      1. public T get() {
      2. Thread t = Thread.currentThread();
      3. ThreadLocalMap map = getMap(t);
      4. if (map != null) {
      5. ThreadLocalMap.Entry e = map.getEntry(this);
      6. if (e != null) {
      7. @SuppressWarnings("unchecked")
      8. T result = (T)e.value;
      9. return result;
      10. }
      11. }
      12. return setInitialValue();
      13. }
  5. 设置ThreadLocal

    1. public void set(T value) {
    2. Thread t = Thread.currentThread();
    3. ThreadLocalMap map = getMap(t);
    4. if (map != null)
    5. map.set(this, value);
    6. else
    7. createMap(t, value);
    8. }