ThreadLocal
很容易让人望文生义,想当然地认为是一个本地线程,实际上这是一种错误的理解。实际上ThreadLocal
并不是一个 Thread
,而是 Thread
的一个局部变量,这点从源码中就能看出来。
public class Thread implements Runnable {
/* ThreadLocal values pertaining to this thread. This map is maintained by the ThreadLocal class. */
ThreadLocal.ThreadLocalMap threadLocals = null;
/*
* InheritableThreadLocal values pertaining to this thread. This map is
* maintained by the InheritableThreadLocal class.
*/
ThreadLocal.ThreadLocalMap inheritableThreadLocals = null;
}
当使用 ThreadLocal
维护变量时,ThreadLocal
为每个使用该变量的线程 提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。
ThreadLocal
既然是线程局部变量,那么理所当然就应该存储在自己的线程对象中,从源码中可以看到线程局部变量是存储在 Thread
对象的 threadLocals
属性中,而 threadLocals
属性是一个 ThreadLocal.ThreadLocalMap
对象。
一、Thread 、ThreadLocal 和 ThreadLocalMap 之间的关系?
Thread
中的threadLocals
属性就是ThreadLocal.ThreadLocalMap
ThreadLocalMap
为ThreadLocal
的静态内部类
public class ThreadLocal {
// 省略部分代码 ...
static class ThreadLocalMap {
// 静态内部类
static class Entry extends WeakReference