讲透ThreadLocal

2023年 8月 18日 31.1k 0

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
  • ThreadLocalMapThreadLocal 的静态内部类
public class ThreadLocal {

// 省略部分代码 ...

static class ThreadLocalMap {
// 静态内部类
static class Entry extends WeakReference

相关文章

如何删除WordPress中的所有评论
检查WordPress服务器磁盘使用情况的7种简便方法(查找大文件和数据)
如何更改WordPress常量FS_METHOD
如何为区块编辑器、Elementor等构建WordPress文章模板
如何彻底地删除WordPress主题及相关内容
如何使用WordPress搭建一个内网

发布评论