【JUC】ThreadLocal 如何实现数据的线程隔离?

简介: 【1月更文挑战第15天】【JUC】ThreadLocal 如何实现数据的线程隔离?ThreadLocal 导致内存泄漏问题?

ThreadLocal 如何实现数据的线程隔离?

ThreadLocal本身其实并不维护存储数据的Map或者EntryThreadLocal只是提供了操作数据的功能。最终存储数据的结构是ThreadLocalMap中的Entry

Thread中维护了对ThreadLocal中的ThreadLocalMap进行维护。一个线程维护一个ThreadLocalMapEntryKey维护操作的ThreadLocal实例。一个线程一份,实现数据隔离。

ThreadLocal 导致内存泄漏问题?

ThreadLocal + 线程池 导致内存泄漏:

ThreadLocal配合线程池的场景下使用很有可能导致内存泄漏,进而导致OOM

如果当ThreadLocal对象在使用完之后,应该要把设置的KeyValue,也就是Entry对象进行设置null,使得GC能够正常回收。

但是由于线程池中的线程不会进行回收,线程对象中的threadLocals属性是通过强引用指向ThreadLocalMapThreadLocalMap通过强引用指向Entry对象,线程池中的Thread对象不会回收,导致Entry对象也不会被回收,从而出现内存泄漏。

解决方案:

在使用完ThreadLocal对象之后,手动调用remove方法,清除Entry对象。

相关文章
|
1月前
|
存储 前端开发 Java
【C++ 多线程 】C++并发编程:精细控制数据打印顺序的策略
【C++ 多线程 】C++并发编程:精细控制数据打印顺序的策略
45 1
|
1月前
|
存储 Java 测试技术
ThreadLocal:线程专属的变量
ThreadLocal:线程专属的变量
42 0
|
1月前
|
安全 Java
java中线程经常被问到ThreadLocal你懂吗?
java中线程经常被问到ThreadLocal你懂吗?
7 0
|
1月前
|
Java 关系型数据库 MySQL
【数据库连接,线程,ThreadLocal三者之间的关系】
【数据库连接,线程,ThreadLocal三者之间的关系】
21 0
|
1月前
|
Java easyexcel 应用服务中间件
【二十五】springboot使用EasyExcel和线程池实现多线程导入Excel数据
【二十五】springboot使用EasyExcel和线程池实现多线程导入Excel数据
211 0
|
1月前
|
存储 安全 Java
调用链跨线程传递 ThreadLocal 对象对比
说起本地线程专属变量,大家首先会想到的是 JDK 默认提供的 ThreadLocal,用来存储在整个链路中都需要访问的数据,并且是线程安全的。由于在落地全链路压测的过程中,一个基本并核心的功能需求是流量标记需要在整个链路中进行传递,那么线程上下文环境成为解决这个问题最合适的技术。
44 2
调用链跨线程传递 ThreadLocal 对象对比
|
1月前
|
存储 安全 Java
多线程------ThreadLocal详解
多线程------ThreadLocal详解
|
1月前
|
安全 Java C++
JUC(java.util.concurrent)的常见类(多线程编程常用类)
JUC(java.util.concurrent)的常见类(多线程编程常用类)
|
2月前
|
存储 安全 Python
什么是Python中的线程局部存储(Thread Local Storage)?
【2月更文挑战第3天】【2月更文挑战第6篇】
|
2月前
|
安全 Java
多线程(进阶三:JUC)
多线程(进阶三:JUC)
45 0