ThreadLocal 源码解析

目录

源码概览

ThreadLocal

ThreadLocalMap

ThreadLocal

nextHashCode

set方法

get方法

ThreadLocalMap

和HashMap的区别

1解决hash冲突的思路不一样

2 初始加载因子 不一样

3.set get不一样

4.key的要求

Entry

set方法

get方法


源码概览

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

trigger333

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值