也就是说,线程的局部变量主要是每个线程的私有数据。无论何时创建一个变量,那么访问此变量的每个线程都会将此变量的本地副本存储在当前线程中。只能访问您自己的线程,也不能与其他线程共享。
从类源代码开始,您可以看到中国有两个对象
类存储变量私有螺纹局部值中的变量
threadlocalmap
这是由ThreadLocal类实现的自定义hashmap
表中的关键是弱参考。这是值得探索的一点。为什么Java将密钥设计为弱参考?
最终变量放置在当前线程的螺纹截图中。它不在threadlocal上。可以将ThreadLocal理解为仅螺纹LocalMap的封装,该封装传达了变量值。
它主要用于将主线程的对象传递到子线程
结果
语句的对象可以由子线程继承。
内存泄漏
申请内存后,该过程无法释放应用的内存空间。内存泄漏的危害可以忽略,但是内存泄漏的效果非常严重。
我看到的许多文章都说记忆泄漏是由弱参考引起的。弱参考对象是,当GC在外部没有引用时,GC被回收为NULL,但值仍然具有很强的参考,则可能是Bethere可能是内存泄漏的问题
但是实际上,由于螺纹 - > threadlocalmap-> entry->值就存在这样的参考链,只要没有退出,生命周期就会与长期相同。如果未手动删除,内存泄漏将不可避免地发生。其他大多数人都通过线程池操作线程。
如果已解决内存泄漏,那是吗?
设置两层保证:
内存泄漏的根本原因是,因为生命周期与相同的删除相同,如果相应的删除对应,则会导致内存泄漏,而不是由于参考较弱。
建议:使用ThreadLocal时要及时养成习惯
有两种删除它们的方法:
通过三种方法的源代码调用,您可以清楚地知道您已经完成了许多删除操作,以防止内存泄漏
gungungestalentry:它启动了螺纹网的回收节点。
可以看出,底层仍被清除。但是清除范围比
底层不使用底层的地图数据结构,因此您需要使用不同的哈希冲突解决方案来使用数组 +链接列表(链接到一定长度到红色黑树的一定长度)来解决哈希冲突的问题。
相关扩展参数:
具体方法
从基本参数,扩展参数和set()中的扩展来判断,我们知道基本的扩展判断
然后检查方法
扩展操作被清除两次,并在每次删除后执行阈值计算。排量将再次清除关键元素
【相关信息】