ThreadLocal原理分析

ThreadLocal实现原理

首先 ThreadLocal 是一个泛型类,保证可以接受任何类型的对象。

因为一个线程内可以存在多个 ThreadLocal 对象,所以其实是 ThreadLocal 内部维护了一个 Map ,这个 Map 不是直接使用的 HashMap ,而是 ThreadLocal 实现的一个叫做 ThreadLocalMap 的静态内部类。而我们使用的 get()、set() 方法其实都是调用了这个ThreadLocalMap类对应的 get()、set() 方法。最终的变量是放在了当前线程的 ThreadLocalMap 中,并不是存在 ThreadLocal 上,ThreadLocal 可以理解为只是ThreadLocalMap的封装,传递了变量值。

内存泄漏问题

实际上 ThreadLocalMap 中使用的 key 为 ThreadLocal 的弱引用,弱引用的特点是,如果这个对象只存在弱引用,那么在下一次垃圾回收的时候必然会被清理掉。

所以如果 ThreadLocal 没有被外部强引用的情况下,在垃圾回收的时候会被清理掉的,这样一来 ThreadLocalMap中使用这个 ThreadLocal 的 key 也会被清理掉。但是,value 是强引用,不会被清理,这样一来就会出现 key 为 null 的 value。

ThreadLocalMap实现中已经考虑了这种情况,在调用 set()、get()、remove() 方法的时候,会清理掉 key 为 null 的记录。如果说会出现内存泄漏,那只有在出现了 key 为 null 的记录后,没有手动调用 remove() 方法,并且之后也不再调用 get()、set()、remove() 方法的情况下。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 概述 ​ 在解决多线程共享变量是,我们常常使用synchronzed或者锁限制共享变量同一时刻只能有一...
    宸小朔阅读 364评论 0 3
  • 接下来笔者的文章方向偏向于 Android & Java 面试相关知识点系统性的总结,欢迎关注。 ThreadLo...
    却把清梅嗅阅读 979评论 0 7
  • 一、简介 并发编程中,当访问共享数据时,通常需要使用同步技术。但如果数据不发布(逸出)到线程以外,仅仅在单线程中被...
    邱simple阅读 3,463评论 3 12
  • 眼睛终于好了,又见春暖花开,嫩芽新叶,生机勃勃,万物复新。 没有什么比这更让我高兴了,前后经历了三个多月的治疗,终...
    林家长生阅读 84评论 0 0
  • 近年来各种狗的品种在各界盛行,学校里有学生狗,大学里有考研狗,单身狗哪里都有,其实有的时候仔细想想,为什么把人必做...
    图图22阅读 871评论 0 0