目录
源码概览
ThreadLocal
ThreadLocalMap
ThreadLocal
nextHashCode
set方法
public void set(T value) {
Thread t = Thread.currentThread(); //拿到当前线程
ThreadLocalMap map = getMap(t); // 返回这个线程内部的ThreadLocalMap
if (map != null) // 如果不为空就set
map.set(this, value);
else
createMap(t, value); // 为空就创建并且set
}
ThreadLocalMap getMap(Thread t) {
return t.threadLocals;
}
get方法
ThreadLocalMap
Thread 类里面有 一个 成员变量 default修饰
ThreadLocalMap是ThreadLocal的一个静态内部类,ThreadLocalMap仅用来维护线程本地变量值。
和HashMap的区别
1解决hash冲突的思路不一样
HashMap是拉链法, ThreadLocalMap使用的是开放寻址法 。
2 初始加载因子 不一样
HashMap 0.75
ThreadLocalMap 是0.666
3.set get不一样
ThreadLocalMap多了判断key 为null的逻辑
4.key的要求
ThreadLocalMap的key 只能是 ThreadLocal的实例
而hashmap的key 是引用数据类型即可
Entry
Entry是ThreadLocalMap的一个静态内部类
为了解决内存占用大和生命周期长的局部变量,hash表中的keys采用弱引用。
关于ThreadLocal的 内存泄漏问题参考:
ThreadLocal 原理及例子_trigger333的博客-CSDN博客_threadlocal例子
set方法
get方法
首先通过求余得到桶的索引,再判断该索引对应的位置是否有元素,并且对应的key是不是和输入参数相等(使用== 直接判断地址值),如果是 那么返回该Entry
如果不是 ,就令索引+1(线性探测) 去找下一个位置
在找的过程中,如果有entry不为null 但是key是null ,那么就回收对应的value(避免内存泄漏)
如果找到匹配的key 就返回entry
如果对应的e是null 那么说明没有这个threadLocal 返回null
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/92782.html