ThreadLocal 源码解析

导读:本篇文章讲解 ThreadLocal 源码解析,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

目录

源码概览

ThreadLocal

ThreadLocalMap

ThreadLocal

nextHashCode

set方法

get方法

ThreadLocalMap

和HashMap的区别

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

2 初始加载因子 不一样

3.set get不一样

4.key的要求

Entry

set方法

get方法


源码概览

ThreadLocal

ThreadLocal 源码解析

ThreadLocalMap

ThreadLocal 源码解析

ThreadLocal

nextHashCode

ThreadLocal 源码解析

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方法

ThreadLocal 源码解析

ThreadLocalMap

Thread 类里面有 一个 成员变量 default修饰

ThreadLocal 源码解析

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例子

ThreadLocal 源码解析

set方法

ThreadLocal 源码解析

ThreadLocal 源码解析

get方法

ThreadLocal 源码解析

ThreadLocal 源码解析

首先通过求余得到桶的索引,再判断该索引对应的位置是否有元素,并且对应的key是不是和输入参数相等(使用== 直接判断地址值),如果是 那么返回该Entry

如果不是 ,就令索引+1(线性探测) 去找下一个位置

在找的过程中,如果有entry不为null 但是key是null ,那么就回收对应的value(避免内存泄漏)

如果找到匹配的key 就返回entry

如果对应的e是null 那么说明没有这个threadLocal 返回null

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/92782.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!