type
status
date
slug
summary
tags
category
icon
password
😀
这里写文章的前言: 一个简单的开头,简述这篇文章讨论的问题、目标、人物、背景是什么?并简述你给出的答案。
可以说说你的故事:阻碍、努力、结果成果,意外与转折。
 

📝 ThreadLocal源码阅读

ThreadLocal 是来这个公司有过使用一次的感受,所以就学习阅读下源码。 其实Thread 这个里面,就有一个 Map(这里是用ThreadLocal内部类中实现的) , 里面的key就是 ThreadLocal, value 就是存储的值,所以一个Thread是有多个 ThreadLocal

参数

方法

set 赋值

get方法

get 获取值方法

remove方法

remove 方法就是获取map,如果map不是null的话,就调用m.remove(this),根据当前this来删除
 

📔为什么要将key设计成ThreadLocal的弱引用?

如果 ThreadLocal 的 Key 是强引用,同样会发生内存泄漏的。如果 ThreadLocal的Key是强引用,引用的ThreadLocal的对象被回收了,但是ThreadLocalMap还持有ThreadLocal的强引用,如果没有手动删除,ThreadLocal不会被回收,发生内存泄露,用强引用100%发生内存泄漏
如果是弱引用的话,引用的ThreadLocal的对象被回收了,即使没有手动删除,ThreadLocal也会被回收.value也会在ThreadLocalMap调用 set()get()
remove() 的时候会被清除.
所以两种方案比较下来,还是ThreadLoaclkey为弱引用好一些
notion image
 

🤗 总结归纳

ThreadLocal里面的方法也比较少,还是比较好理解的。只要弄清楚ThreadLocal和Thread是怎么在存储的,就很好的理解了
注意 : 使用ThreadLocal一定要进行remove,否则容易出现内存泄漏,从而导致内存溢出

📎 参考文章

 
💡
有关文章的问题,欢迎您在底部评论区留言,一起交流~