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

Thread、ThreadLocal、ThreadLocalMap

参考:

 Java并发常见面试题总结(下) | JavaGuide

ThreadLocal 详解 | JavaGuide

通常情况下,我们创建的变量可以被任何一个线程访问和修改。这在多线程环境中可能导致数据竞争和线程安全问题。那么,如果想让每个线程都有自己的专属本地变量,该如何实现呢?

JDK 中提供的 ThreadLocal 类正是为了解决这个问题。ThreadLocal 类允许每个线程绑定自己的值。

ThreadLocalMap

每个Thread对象内部都有一个成员变量 ThreadLocalMap。

ThreadLocalMap是一个定制哈希表,定义在ThreadLocal内部,key是ThreadLocal的实例(弱引用),value是set进去的值(强引用)。

ThreadLocal

ThreadLocal相当于一个工具类,对外暴露get、set、remove方法,在内部再通过currentThread拿到当前线程的ThreadLocalMap,再操作这个 map。

存储结构示例: 

Thread t1
├── threadLocals (ThreadLocalMap)
│   ├── Entry[0]: key=ThreadLocal@A(弱引用), value=UserObj@X
│   ├── Entry[1]: key=ThreadLocal@B(弱引用), value=UserObj@Y
│   └── ...

ThreadLocal缺点

  1. 内存泄漏

    • 柜子钥匙(ThreadLocal 对象)是弱引用,容易被垃圾回收。

    • 但柜子里面的value 是强引用,如果线程一直不死(如线程池复用),value 就永远占着内存 。

    • 解决:用完一定finally { threadLocal.remove(); }

  2. 脏读

    • 线程池把同一条线程反复租给不同任务,上一次任务留下的 value 被下一次任务“误拿”,出现数据串味

    • 解决:同上,任务开始前先 remove()

  3. 不可继承

    • 主线程的 ThreadLocal 值,子线程默认看不见(父子线程不同柜子)。

    • 若需要传递,用 InheritableThreadLocal,但也只能传创建子线程那一刻的“快照” 。

http://www.dtcms.com/a/360453.html

相关文章:

  • 用户态 kill 与 pthread_kill 的区别?
  • 动态链表:结构体模拟单链表的终极指南
  • ts 定义类型
  • Linux学习:简单模拟实现C++中的线程类
  • C++算法学习专题:前缀和
  • 【Linux网络编程】应用层协议-----HTTP协议
  • PostgreSQL表膨胀的危害与解决方案
  • More Effective C++ 条款19:理解临时对象的来源(Understand the Origin of Temporary Objects)
  • centos 7 安装docker、docker-compose教程
  • AI 编程新玩法:用 yunqi-saas-kit 框架制作小游戏,看广告变现轻松赚钱​
  • 国产数据库之TiDB:博采众长
  • Ruoyi-vue-plus-5.x第二篇MyBatis-Plus数据持久层技术:2.2 分页与性能优化
  • [嵌入式embed]Keil5项目提示Missing: Compiler Version 5
  • 工业互联项目总结:UART
  • Backroom:信息代币化 AI 时代数据冗杂的解决方案
  • 漏洞基础与文件包含漏洞原理级分析
  • 使用 Python mlxtend库进行购物篮分析、关联规则
  • 软考中级习题与解答——第一章_数据结构与算法基础(3)
  • 进程状态 —— Linux内核(Kernel)
  • Linux 文件夹权限也会导致基本命令权限缺失问题
  • 【学Python自动化】 5. Python 数据结构学习笔记
  • postman带Token测试接口
  • 打工人日报#20250831
  • LangChain核心抽象:Runnable接口深度解析
  • * 和**有时展开,有时收集。*在对可迭代对象展开 **对字典展开。一般只看收集就够了,在函数定义的时候传入参数用
  • 第二十七天-ADC模数转换实验
  • linux系统学习(12.linux服务)
  • 【星闪】Hi2821 | SPI串行外设接口 + OLED显示屏驱动例程
  • 语音芯片3W输出唯创知音WTN6040FP、WT588F02BP-14S、WT588F04AP-14S
  • [回溯+堆优化]37. 解数独