ThreadLocal 类

ThreadLocal 是什么

  • ThreadLocal 是一个泛型类,用于在线程中定义局部变量。官方的解释为:这个类提供线程的局部变量
  • TheadLocal 类不继承 Thread 类,也不实现 Runable 接口,ThreadLocal 类为每一个线程都维护了自己独有的变量;也就是说 ThreadLocal 中的变量属于当前线程,每个线程可以访问自己内部的变量
  • ThreadLocal 并不是用来解决多线程环境下的共享变量问题,而是用来提供线程内部的共享变量,在多线程环境下,可以保证各个线程之间的变量互相隔离、相互独立

ThreadLocal 的重要说明

ThreadLocalMap 说明

  • ThreadLocalMapThreadLocal 类中的一个静态内部类
  • ThreadLocalMap 内部定义了弱引用的数组 Entry 用来存放 keyvalueEntry 数组的默认容量为 16,并且数组的容量必须为 2 的次幂
static class ThreadLocalMap {
   
	// ThreadLocalMap内部声明的Entry,用于存放key和value,key为ThreadLocal类型的弱引用
	static class Entry extends WeakReference<ThreadLocal<?>> {
   
		Object value;
		Entry(ThreadLocal<?> k, Object v) {
   
			super(k);
			value = v;
		}
	}
	
	// 内部Entry数组的默认初始容量为16,数组的容量必须为2的幂
	// 由于ThreadLocalMap内部有很多(容量-1)的与运算(&)计算数组索引,
	// 容量为2的幂可以保证(容量-1)转化为二进制后最后一位始终是1,这样可以有效的减少碰撞几率
	private static final int INITIAL_CAPACITY = 16;

	private Entry[] table;

	private int size = 0;

	// 数组扩容临界点
	private int threshold; 
}
  • 每个 Thread 维护了一个 ThreadLocalMap 映射表,这个映射表的 keyThreadLocal 实例本身。value 是真正需要存储的变量
  • ThreadLocal 本身并不存储值,它只是作为一个 key 来让线程从 ThreadLocalMap 中获取 value。注意,ThreadLocalMap 是使用 ThreadLocal 的弱引用作为 key

在这里插入图片描述

Thread 类中的 threadLocals 变量

ThreadLocal.ThreadLocalMap threadLocals = null;

ThreadLocal 源码

ThreadLocal 中的 set() 方法

public void set(T value) {
   
	Thread t = Thread.currentThread();
	ThreadLocalMap map = getMap(t);
	if (map != null)
		// 调用ThreadLocalMap类的set方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值