ThreadLocal的 key 是弱引用,那么在 ThreadLocal.get()的时候,发生GC之后,key 是否为null?
时间: 2023-10-17 10:32:40 浏览: 327
在 ThreadLocal 中,key 是使用弱引用(WeakReference)来持有线程特定的值的。当发生垃圾回收时,如果 key 对应的线程已经被回收,那么 key 会被置为 null。
在 ThreadLocal 的 get() 方法中,会先获取当前线程的 ThreadLocalMap,并通过 key 来获取对应的值。如果 key 为 null,那么 get() 方法会返回 null,表示当前线程没有设置过与该 ThreadLocal 相关联的值。
需要注意的是,垃圾回收只会在 JVM 空闲或内存紧张时才会触发,而且不同的 JVM 实现可能有不同的垃圾回收策略。因此,并不是每次发生 GC 时都会导致 key 被置为 null。但是,当发生 GC 且线程被回收时,key 会被置为 null。
相关问题
threadlocal弱引用
ThreadLocal中使用弱引用的原因是为了解决内存泄漏的问题。当我们将ThreadLocal对象置为null后,如果ThreadLocalMap中的entry的key仍然是强引用,那么对象A就无法被回收。因为ThreadLocalMap中的entry会持有key的引用,直到该线程被销毁。然而,线程很可能会被放到线程池中重复使用,导致内存泄漏。
通过使用弱引用,当ThreadLocal对象的强引用被取消后,它就只剩下一个弱引用了。弱引用在JVM触发GC回收时会被回收。因此,在下一次调用get()、set()、remove()方法时,ThreadLocalMap中的key为null的entry就会被删除,实现了惰性删除和释放内存的作用。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *2* [ThreadLocal的弱引用](https://blog.csdn.net/AAA821/article/details/103794227)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"]
- *3* [Threadlocal中的弱引用到底是怎么一回事](https://blog.csdn.net/m0_59602613/article/details/123759760)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"]
[ .reference_list ]
阅读全文