ThreadLocal源码探究 (JDK 1.8)

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

ThreadLocal源码探究 (JDK 1.8)

纳兰小依   2020-03-06 我要评论
`ThreadLocal`类之前有了解过,看过一些文章,自以为对其理解得比较清楚了。偶然刷到了一道关于`ThreadLocal`内存泄漏的面试题,居然完全不知道是怎么回事,痛定思痛,发现了解问题的本质还是需要从源码看起。 `ThreadLocal`可以保存一些线程私有的数据,从而避免多线程环境下的数据共享问题。`ThreadLocal`存储数据的功能是通过`ThreadLocalMap`实现的,这是`ThreadLocal`的一个静态内部类。`ThreadLocal`源码加注释总共`700`多行,`ThreadLocalMap`就占据了接近`400`行,基本上理解了`ThreadLocalMap`也就理解了`ThreadLocal`。本文先简介`ThreadLocalMap`,然后从`ThreadLocal`的核心方法开始讲起,需要用到`ThreadLocalMap`的地方顺带一起介绍。 ## 1.ThreadLocalMap简介 `ThreadLocalMap`本质上仍然是一个`Map`,具有普通`Map`的特点,当遇到`hash`冲突的时候,采用线性探测的方式来解决冲突,底层使用数组作为存储结构,它的主要字段如下: - `INITIAL_CAPACITY`:初始容量,默认是`16` - `Entry[] table`:存储键值对的数组,其大小是`2`的整数幂 - `size`:数组内存储的元素个数 - `threshold`:扩容阈值 `ThreadLocalMap`底层数组保存的是`Entry`类型键值对,`Entry`是`ThreadLocalMap`的一个内部类,它是用来存储键值对的对象,值得关注的是`Entry`继承了`WeakReference`这个弱引用类,这意味着`Entry的key`引用的对象,在没有其他强引用的情况下,在下一次GC的时候就会被回收(注意:这里忽略了软引用,因为软引用是在即将因为内存不足而抛出异常的时候才会回收)。并且`Entry`的`key`是`ThreadLocal`对象,通过其祖父类`Reference`的构造函数可以看到,`key`实际上是被保存在`referent`字段中,`Entry`对象的`get`方法也是从`Reference`继承过来的,直接返回该`referent`字段。 ``` static class Entry extends WeakReference

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们