讲透ThreadLocal

2023年 8月 18日 65.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

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论