美文网首页
关于ThreadLocal的释疑

关于ThreadLocal的释疑

作者: liucyu | 来源:发表于2018-05-22 18:37 被阅读29次

强引用

如果一个对象具有强引用,那么绝不会被垃圾回收器回收,即使抛出OO异常

软引用

如果一个对象具有软引用,那么就在垃圾回收器之后内存依然不足的情况下被垃圾回收器回收。对应于生活中的食之无味弃之可惜之物品的设定,如果空间足够则不做丢弃,如果空间清扫后依然不足则被丢弃。

弱引用

如果一个对象具有弱引用,那么就在垃圾回收器的线程扫描时必定被干掉,不过由于垃圾回收器线程优先级比较低,所以弱引用的对象也不会那么容易被发现

GC ROOT

虚拟机(JVM)栈中引用对象

方法区中的类静态属性引用对象

方法区中常量引用的对象(final 的常量值)

本地方法栈JNI的引用对象

由来

我们会在开发中遇到一种情形,如果需要用一个全局静态变量Map来保存线程和与之对应的值 比如 Map map = HashMap<>,但随之带来的一个问题就是我们如何在线程结束之后把与之对应的值删除呢?ThreadLocal就是为了解决这种问题存在的,且对用户透明

ThreadLocal源码的大致思路如下:每个Thread里面保存有一个TheadLocalMap对象,里面对应的Entry 的key为ThreadLocal的弱引用,所以我们能在当前线程得到ThreadLocal对应的值……引出一个问题,为什么要用弱引用来作为key? 

(实线为强引用,虚线为弱引用) 

当图中ThreadLocal实例被设置为null之后没有任何强引用指向ThreadLocal,那key对应的弱引用被回收( 一开始的认知总会感觉,用一个weakreference去引用一个对象一点都不靠谱,毕竟该引用指向的对象,在GC的时候就会被回收,完全没有任何保证。针对上面这个想法,因为一个对象可能会存在多个引用参与,所以应该更多是强弱同时去引用某个对象,只有当所有强引用都失效之后,你的这个弱引用才有风险被回收掉。),但是value却存在一条由Current Thread ref引出的强引用,此时value是不可能被GC掉的,直到线程结束,引用链被断开,对象才有可能被回收。

相关文章

  • 关于ThreadLocal的释疑

    强引用 如果一个对象具有强引用,那么绝不会被垃圾回收器回收,即使抛出OO异常 软引用 如果一个对象具有软引用,那么...

  • 死磕源码系列 - ThreadLocal

    关于 ThreadLocal 先问几个问题 ThreadLocal 基于什么场景下使用? ThreadLocal ...

  • Handler消息机制

    ThreadLocal ThreadLocal是一个关于创建线程局部变量的类。使用ThreadLocal创建的变量...

  • Android关于ThreadLocal的思考和总结

    前言 Handler机制引出ThreadLocal 关于ThreadLocal的分析,首先得从Android的消息...

  • ThreadLocal小结-到底会不会引起内存泄露

    [TOC] 1. ThreadLocal简介 网上看到一些文章,提到关于ThreadLocal可能引起的内存泄露,...

  • 关于ThreadLocal

    先从一个案例开始入手: 有这样一个场景,多个线程查询用户的出生日期,其中birthDate(int userId)...

  • ThreadLocal 原理

    总述 ThreadLocal 在面试中经常提到,关于ThreadLocal使用不当造成OOM以及在特殊场景下,通过...

  • ThreadLocal

    ThreadLocal是一个关于创建线程局部变量的类。使用ThreadLocal创建的变量是线程隔离的,其他线程则...

  • ThreadLocal

    ThreadLocal## 关于创建线程局部变量的一个类在Thread中有这么一个成员变量 ThreadLocal...

  • ThreadLocal

    关于ThreadLocal请参考这篇文章 解密ThreadLocal, 基本上都全了.这里主要是写一些自己的理解 ...

网友评论

      本文标题:关于ThreadLocal的释疑

      本文链接:https://www.haomeiwen.com/subject/ahekjftx.html