当前位置: 首页 > article >正文

ThreadLocal如何实现的

ThreadLocal的实现

ThreadLocal

ThreadLocal是java.lang下面的一个类,是用来解决java多线程程序中并发问题的一种途径;通过为每一个线程创建一份共享变量的副本来保证各个线程之间的变量的访问和修改互相不影响。

共享与互斥

ThreadLocal存放的值是线程内共享的,线程间互斥的,主要用于线程内共享一些数据,避免通过参数来传递,这样处理后,能够优雅的解决一些实际问题。
比如一次用户的页面操作请求,我们可以在最开始的filter中,把用户的信息保存在ThreadLocal中,在同一次请求中,在使用到用户信息,就可以直接到ThreadLocal中获取就可以了。

实现原理

ThreadLocal中用于保存线程的独有变量的数据结构是一个内部类:ThreadLocalMap,也是k-v结构。key就是当前的ThreadLocal对象,而v就是我们想要保存的值。

Thread类对象中维护了ThreadLocalMap成员变量,而ThreadLocalMap维护了以ThreadLocal为key,需要存储的数据为value的Entry数组。

查看Thread类,内部维护了两个变量,threadLocals和inheritableThreadLocals,它们的默认值是null。

    /* 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.ThreadLocalMap,也就是ThreadLocal类的一个静态内部类ThreadLocalMap,在静态内部类ThreadLocalMap维护一个数据结构类型为Entry的数组。

public class ThreadLocal<T> {
	...
	static class ThreadLocalMap {
		...
        /**
         * The entries in this hash map extend WeakReference, using
         * its main ref field as the key (which is always a
         * ThreadLocal object).  Note that null keys (i.e. entry.get()
         * == null) mean that the key is no longer referenced, so the
         * entry can be expunged from table.  Such entries are referred to
         * as "stale entries" in the code that follows.
         */
        static class Entry extends WeakReference<ThreadLocal<?>> {
            /** The value associated with this ThreadLocal. */
            Object value;

            Entry(ThreadLocal<?> k, Object v) {
                super(k);
                value = v;
            }
        }
		...
	}
	...
}

http://www.kler.cn/a/510558.html

相关文章:

  • TTL 在 Redis 缓存中的作用
  • 口令攻击和钓鱼攻击
  • 如何设置HTTPS站点防御?
  • 【大数据】机器学习------支持向量机(SVM)
  • 接口防篡改+防重放攻击
  • 向harbor中上传镜像(向harbor上传image)
  • 【HarmonyOS之旅】基于ArkTS开发(二) -> UI开发之常见布局
  • 硬件学习笔记--33 GB/T 17215.211相关内容介绍
  • 双序列双指针
  • Python(十七)excel指定列自动翻译成英文
  • 多学科视角下探索开源Github、Git初步学习
  • 企业邮箱iRedMail搭建
  • 一岁征程:学习、挑战与成长
  • wireshark工具简介
  • 如何引导LabVIEW项目相关方合理参与项目?
  • 【2024年华为OD机试】(C卷,100分)- 求满足条件的最长子串的长度 (Java JS PythonC/C++)
  • Spring篇 解决因为Bean的循环依赖——理论篇
  • 基于springboot的教师人事档案管理系统
  • vue移动端统计分析echarts开发小结(多提示框渲染,下载适配,数据量大的时候不分页崩溃等)
  • 用LSTM模型预测股价的例子(1)
  • Chromium 132 编译指南 Linux 篇 - 安装 Chromium 官方工具(三)
  • 河北省乡镇界面图层shp格式arcgis数据乡镇名称和编码2020年wgs84坐标无偏移内容测评
  • 山西省乡镇界面图层shp格式arcgis数据乡镇名称和编码2020年wgs84坐标无偏移测评
  • HRNet,Deep High-Resolution Representation Learning for Visual Recognition解读
  • 缓存、数据库双写一致性解决方案
  • 计算机毕业设计PySpark+Hadoop+Hive机票预测 飞机票航班数据分析可视化大屏 航班预测系统 机票爬虫 飞机票推荐系统 大数据毕业设计