ThreadLocal的工作原理及源码解析

ThreadLocal本质来说就是一个线程内部存储类,从而让多个线程只操作自己内部的值,从而实现线程数据隔离

每个线程内有一个 ThreadLocalMap 类型的成员变量,用来存储资源对象

图片[1]-ThreadLocal的工作原理及源码解析-不念博客

ThreadLocalMap特点

  • key 的 hash 值统一分配
  • 初始容量 16,扩容因子 2/3,扩容容量翻倍
  • key 索引冲突后用开放寻址法解决冲突

ThreadLocal基本使用

  • set(value) 设置值:  以 ThreadLocal 自己作为 key,资源对象作为 value,放入当前线程的 ThreadLocalMap 集合中
  • get() 获取值: 以 ThreadLocal 自己作为 key,到当前线程中查找关联的资源值
  • remove() 清除值: 以 ThreadLocal 自己作为 key,移除当前线程关联的资源值

代码案例

public class ThreadLocalTest {
    static ThreadLocal<String> threadLocal = new ThreadLocal<>();

    public static void main(String[] args) {
        new Thread(() -> {
            String name = Thread.currentThread().getName();
            threadLocal.set("zbbmeta");
            print(name);
            System.out.println(name + "-after remove : " + threadLocal.get());
        }, "t1").start();
        new Thread(() -> {
            String name = Thread.currentThread().getName();
            threadLocal.set("zbbmeta");
            print(name);
            System.out.println(name + "-after remove : " + threadLocal.get());
        }, "t2").start();
    }

    static void print(String str) {
        //打印当前线程中本地内存中本地变量的值
        System.out.println(str + " :" + threadLocal.get());
        //清除本地内存中的本地变量
        threadLocal.remove();
    }

}
© 版权声明
THE END