【退役之重学Java】ThreadLocal

一、ThreadLocal 与 Synchronized 区别

ThreadLocal:

  1. 采用"以空间换时间"的方式,为每一个线程都提供了一份变量的副本,从而实现同时访问而互不干扰
  2. 多线程中让每个线程之间的数据相互隔离

Synchronized

  1. 同步机制采用"以时间换空间"的方式,值提供一份变量,荣不同的线程排队访问
  2. 对个线程之间访问资源的同步

二、ThreadLocal 方案的好处

  1. 传递数据: 保存每个线程绑定的数据,在需要的地方可以直接过去,避免参数直接传递带来的代码耦合问题
  2. 线程隔离: 各线程之间的数据相互隔离却又具备并发性,避免同步方式带来的性能损失

三、ThreadLocal 内存泄漏

根源是由于,ThreawdLocalMap 的生命周期跟 Thread 一样长,如果没有手动删除对应的 entry 就对导致内存泄漏

四、避免内存泄漏的方法

  1. 使用完 ThreadLocal ,调用其 remove 方法删除对应的 Entry
  2. (or)使用完 ThreadLocal,当前 Thread 也随之运行结束

五、为什么 Entry 的key 使用弱引用指向 ThreadLocal

  事实上,在 ThreadLocalMap 中的 set/getEntry 方法中,会对 key 为 null (即 ThreadLocal 为 null)进行判断,如果为 null,则将 value 置为 null

  这意味着使用完 ThreadLocal,CurrentThread 依然运行的前提下,就算忘记调用 remove 方法,弱引用比强引用可以多一层保障:

  弱引用的 ThreadLocal 会被回收,对应的 value 在下一次 ThreadLocalMap 调用 set,get,remove 中的任一方法时会被清除,从而避免内存泄漏

六、Hash 冲突的解决

  ThreadLocalMap 使用 线性探测法 来解决 hash 冲突

  该方法一次探测下一个地址,直到有空的地址后插入,若整个空间都找不到空余的地址,则产生溢出。

相关推荐
大圣编蚕8 分钟前
Spring AOP 失效排查:从原理到实战的完整指南
java·后端·spring
Omics Pro10 分钟前
~30,000+引用!理论2005,R包2008,多组学集成AI增强
开发语言·数据库·人工智能·算法·机器学习·自然语言处理·r语言
EatFan15 分钟前
MCP 从概念到落地:Java(Spring AI Alibaba)与 .NET 双栈接入实操对比
java·人工智能·后端·spring·.net·java后端·mcp
专业程序开发源16 分钟前
springboot全民健身和饮食健康管理系统29158-计算机课程设计、毕业设计
java·spring boot·后端·python·django·php·课程设计
ym hyd 11119 分钟前
汽车零部件缺陷管理系统源码 Java+SpringBoot+Vue3 前后分离
java·vue.js·spring boot·汽车·毕设
小道士写程序19 分钟前
Windows Rust 环境安装指导
开发语言·windows·rust
xh didida20 分钟前
Linux -- 进程概念
linux·服务器·开发语言·c++
爱吃香菜的初学者20 分钟前
十三.Linux——信号量
linux·运维·服务器·开发语言
凉茶钱27 分钟前
【C++】string 常用函数详解
开发语言·c++·string
Wang's Blog37 分钟前
Java框架 SpringCloud 快速入门: 从服务拆分到注册中心的落地路线
java·开发语言·spring cloud