当前位置:网站首页>聊聊ThreadLocal
聊聊ThreadLocal
2022-07-27 14:28:00 【华为云】
聊聊ThreadLocal
今天我们聊聊ThreadLocal,虽然开发中用的比较少,但确是面试中经常会问到的点。
每个线程都有个ThreadLocalMap,ThreadLocalMap是ThreadLocal的静态内部类,它的key是ThreadLocal的实例,value是需要存储的对象,而ThreadLocalMap其实是用Entry数组存储的,Entry继承WeakReference,它是一个弱引用。
static class Entry extends WeakReference<ThreadLocal<?>> { /** The value associated with this ThreadLocal. */ Object value; Entry(ThreadLocal<?> k, Object v) { super(k); value = v; } }这里需要普及一下java的四种引用
java的四种引用
强引用:像通过new对象就是强引用,这一般不会被GC回收
软引用:内存不够的时候才会进行内存回收,
弱引用:不管内存够不够用,垃圾回收器在进行回收的时候都会进行内存回收,一般是弱引用在map中使用
虚引用:在任何时候都可能被回收
TheadLocal是线程私有的,线程之间不受影响,所以可以保证线程安全的问题,当我们跨层传递的时候可以考虑使用ThreadLocal,spring的事务信息就是放在ThreadLocal中的
但是大家都知道,ThreadLocal存在内存泄露的问题,所谓内存泄露就是不再使用的对象占用的内存不能够被回收,new对象就有可能导致内存泄露,当ThreadLocal不存在强引用的时候,ThreadLocalMap的key就会被回收,这时候key为null,此时的value却是强引用,那么此时只有当前线程的中断或结束的时候,ThreadLocalMap中的数据才会被清空,如果当前线程一直在运行,显然value不能被回收,就产生了内存泄露。而当key为空的时候,调用ThreadLocalMap的get方法或者set方法或者remove方法的时候都会清除value值
解决方案
解决办法呢就是当我们ThreadLocal使用完毕后,通过调用ThreadLocal的remove方法来进行清除数据,也可以把ThreadLocal设置为private static,这样ThreadLocal就是强引用了,这样TheadLocalMap的key就不会为null,从而在适当的时候就清理掉数据了。
总结
这篇文章主要讲了hreadLocal的相关知识点,包括为什么出现内存泄露的问题,已经对于这种问题的解决方案,并顺带讲了一下java的四种引用方式。
边栏推荐
- js运用扩展操作符(…)简化代码,简化数组合并
- Spark 3.0 adaptive execution code implementation and data skew optimization
- Four kinds of relay schemes driven by single chip microcomputer
- md 中超链接的解析问题:解析`this.$set()`,`$`前要加空格或转义符 `\`
- Huawei's general card identification function enables multiple card bindings with one key
- 【剑指offer】面试题50:第一个只出现一次的字符——哈希表查找
- Spark3中Catalog组件设计和自定义扩展Catalog实现
- Photoelectric isolation circuit design scheme (six photoelectric isolation circuit diagrams based on optocoupler and ad210an)
- EMC design scheme of RS485 interface
- Network equipment hard core technology insider router 20 dpdk (V)
猜你喜欢

Unity performance optimization ----- occlusion culling of rendering optimization (GPU)

Google team launches new transformer to optimize panoramic segmentation scheme CVPR 2022

Spark 任务Task调度异常分析
![[TensorBoard] OSError: [Errno 22] Invalid argument处理](/img/bf/c995f487607e3b307a268779ec1e94.png)
[TensorBoard] OSError: [Errno 22] Invalid argument处理

HaoChen CAD building 2022 software installation package download and installation tutorial

STL value string learning

Jump to the specified position when video continues playing

【剑指offer】面试题42:连续子数组的最大和——附0x80000000与INT_MIN

JUC(JMM、Volatile)

The design method of integral operation circuit is introduced in detail
随机推荐
C语言:三子棋游戏
Implement custom spark optimization rules
Record record record
C语言:动态内存函数
Leetcode 456.132 mode monotone stack /medium
使用Prometheus监控Spark任务
EMC design scheme of CAN bus
multimap案例
C语言:自定义类型
Set the position of the prompt box to move with the mouse, and solve the problem of incomplete display of the prompt box
Spark Bucket Table Join
股票开户佣金优惠,炒股开户哪家证券公司好网上开户安全吗
Explanation of various attributes of "router link"
使用解构交换两个变量的值
Distributed lock
QT (IV) mixed development using code and UI files
Network equipment hard core technology insider router Chapter 4 Jia Baoyu sleepwalking in Taixu Fantasy (Part 2)
Spark TroubleShooting整理
[正则表达式] 单个字符匹配
【剑指offer】面试题46:把数字翻译成字符串——动态规划