讲透ThreadLocal
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.ThreadLocalMapThreadLocalMap为ThreadLocal的静态内部类
public class ThreadLocal {
// 省略部分代码 ...
static class ThreadLocalMap {
// 静态内部类
static class Entry extends WeakReference