ThreadLocal

介绍

该类提供线程局部变量。 这些变量与其正常对应变量的不同之处在于,访问一个变量(通过其 get 或 set 方法)的每个线程都有其自己的、独立初始化的变量副本。 ThreadLocal 实例通常是类中希望将状态与线程关联起来的私有静态字段(例如,用户 ID 或事务 ID)。

只要线程处于活动状态并且 ThreadLocal 实例可访问,每个线程就持有对其线程局部变量副本的隐式引用; 线程消失后,其线程本地实例的所有副本都将受到垃圾回收(除非存在对这些副本的其他引用)。

是一种将变量和线程绑定的方案。

使用

用户登录登出动作,用户信息保存。

  1. 静态变量保存

/**
 * 本地变量测试
 *
 * @author dcx
 * @since 2023-06-26 14:57
 **/
public class NoThreadLocalDemo {
    //类属性保存当前用户名
    private static String curName;

    public void login(String name) {
        System.out.println(name + " login");
        curName = name;
    }

    public void getCur() {
        System.out.println(curName+" get");
    }

    public void logout() {
        System.out.println(curName+" logout");
        curName = null;
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        NoThreadLocalDemo threadLocalDemo = new NoThreadLocalDemo();
        ExecutorService executorService = Executors.newFixedThreadPool(3);
        executorService.execute(() -> {
            threadLocalDemo.login(1 + "");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            threadLocalDemo.getCur();
            threadLocalDemo.logout();
        });

        executorService.execute(() -> {
            threadLocalDemo.login(2 + "");
            threadLocalDemo.getCur();
            threadLocalDemo.logout();
        });
        System.out.println("------");
    }

}

本例中,用户1登录,延迟执行。用户2登录不延迟执行。

执行结果:

可以看出,线程2将用户信息释放,用户1延迟之后的执行出现错误。

  1. threadLocal方式

用户1登录,延迟执行。用户2登录不延迟执行。

可以看出,用户1和用户2正常执行。

核心原理

set

get

thread,threadLocal,threadLocalMap,Entry关系:

  1. thread包含threadLocalMap属性。

  2. threadLocal封装了对threadLocalMap的操作。

  3. threadLocalMap维护着Entry列表。

  4. Entry是一种弱引用,key是threadLocal,value是具体的值。

Drawing
关系图

ThreadlocalMap

是一种专门为保存线程本地变量而设计的一种hash map。

set

resize

rehash里面主要是会进行resize。重点看下这个:

get

不足

无法将变量传递到子线程。

输出:

InheritableThreadLocal 对此做出了优化。

Last updated