ThreadLocal 是什么?
在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。
ThreadLocal并不是一个Thread,而是Thread的局部变量,也许把它命名为ThreadLocalVariable更容易让人理解一些。
在JDK5.0中,ThreadLocal已经支持泛型,该类的类名已经变为ThreadLocal
源码分析
结构
Thread类中有个ThreadLocal.ThreadLocalMap threadLocals = null;变量。ThreadLocal.ThreadLocalMap有个ThreadLocal.ThreadLocalMap.Entry数组ThreadLocal.ThreadLocalMap.Entry键是ThreadLocal 值是value代码
读取ThreadLocal的值,
- 先拿到当前thread的map
- 从map中查找当前threadlocal的值
- 找不到就初始化,然后返回
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
public void set(T value) {Thread t = Thread.currentThread();ThreadLocalMap map = getMap(t);if (map != null)map.set(this, value);elsecreateMap(t, value);}
