ThreadLocal 原理及源码详解

什么是ThreadLocal?

ThreadLocal 是一种提供线程本地变量(也称为线程局部变量)的类,这种变量确保了在不同的线程中访问同一个 ThreadLocal 变量时,每个线程会有一个该变量的私有副本,即使多个线程修改了相同的 ThreadLocal 变量,每个线程所访问的副本仍然是独立的,从而避免了多线程环境下共享变量可能导致的数据不一致和竞争问题。

ThreadLocal 知识储备传送门:

ThreadLocal 实战使用详解

ThreadLocal 内存泄漏和常见问题详解

ThreadLocal 常用方法:

  • ThreadLocal #ThreadLocal():ThreadLocal 构造方法。
  • ThreadLocal #set(T value):设置当前线程绑定的局部变量。
  • ThreadLocal #get():获取当前线程绑定的局部变量。
  • ThreadLocal #remove():移出当前线程绑定的局部变量,防止内存泄漏。
  • ThreadLocal #initialValue():返回当前线程局部变量的初始值。

ThreadLocal 源码分析

ThreadLocal 内部结构:

  • 我们知道 ThreadLocal 是线程本地变量,那 ThreadLocal 肯定是线程的一个属性。
  • ThredLocal 类的内部有一个 ThreadLocalMap 的内部类,来帮我们进行的数据的存储。
  • ThreadLocalMap 的 key 是 ThreadLocal,value 是我们要操作的 value 值,我们可以把 ThreadLocalMap 理解为操作 ThreadLocal 的工具类。

在这里插入图片描述

我们知道 ThreadLocal 是属于 Thread 的,以下代码是摘自 Thread 源码中的一段:

class Thread implements Runnable {
   
   

    //与线程相关的 ThreadLocal值,此Map由 ThreadLocal 类维护
    ThreadLocal.ThreadLocalMap threadLocals = null;

    //与线程相关的InheritableThreadLocal 值。此Map 由 InheritableThreadLocal 类维护(子线程相关的 本次不讨论) 
    ThreadLocal.ThreadLocalMap inheritableThreadLocals = null;
}

可以看到我们本篇讨论的 ThreadLocal 出现了,其出现的地方是 Thread 类中,是 Thread 类的一个变量,ThreadLocal 出现的同时,我们发现了 ThreadLocalMap 的存在,根据 ThreadLocal.ThreadLocalMap 我们知道 ThreadLocalMap 是 ThreadLocal 的一个内部类,我们接着追踪一下 ThreadLocal 源码。

ThreadLocalMap#set(T value) 方法源码分析:

//往ThreadLocalMap 中设置 ThreadLocal 和 value 的关系
private void set(ThreadLocal<?> key, Object value) {
   
   
	//Entry 数组
	Entry[] tab = table;
	//获取数组的长度
	int len = tab.length;
	//返回下一个hashcode
	int i = key.threadLocalHashCode & (len-1);

	//遍历数组
	for (Entry e = tab[i];
		 e != null;
		 e = tab[i = nextIndex(i, len)]) {
   
   
		//获取key ThreadLocal
		ThreadLocal<?> k = e.get();
		//判断是否是当前key
		if (k == key) {
   
   
			//替换 value  返回
			e.value = value;
			return;
		}
		//key 为空
		if (k == null) {
   
   
			//key 为null 时候 清理过期的 entry 有助于 JVM GC
			replaceStaleEntry(key, value, i);
			return;
		}
	}
	
	//创建一个 entry 节点
	tab[i] = new Entry
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值