Java ThreadLocal初识

116 阅读2分钟

这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战

前言

ThreadLocal这个类的作用,相比还有许多的开发同学并不是很了记得呢,今天我们就来介绍一下ThradLocal的一些基本知识。

ThreadLocal介绍

根据这个类名,我们就能大致明白这个类的作用了,ThreadLocal的作用是提供线程的局部变量,这些变量不是我们平时定义的成员变量,成员变量是线程之间共享的。而ThreadLocal变量是线程之间独有(通过 get 或者 set 方法),独立初始化的变量副本,ThreadLocal的推荐用法通常是在类中作为私有的静态字段,里面存放着与线程状态相关联的数据信息(例如,用户 ID 或事务 ID),可能这里大家看的不是很明白,那么我们使用一个代码例子来说明:

import java.util.concurrent.atomic.AtomicInteger;

 // 每个线程获取的都是属于自己的本地ID,与其他线程的ID互不干扰。
 public class ThreadId {
    
     // 这个原子整型负责分配下一个线程ID
     private static final AtomicInteger nextId = new AtomicInteger(0);

     
     // 这个变量中存放着每个线程的唯一ID,在每个线程中都是不一样的
     private static final ThreadLocal<Integer> threadId =
         new ThreadLocal<Integer>() {
             @Override protected Integer initialValue() {
                 return nextId.getAndIncrement();
         }
     };

     // 返回当前线程的唯一ID
     public static int get() {
         return threadId.get();
     }
 }

只要线程是存活状态并且ThradLocal实例是可以获取的,每个线程都会隐式的持有它的线程本地变量,当线程销毁时,所有的线程本地变量都将垃圾回收(除非存在其他的引用)。

ThreadLocal 方法介绍

了解了ThreadLocal的基本概念后,我们来看一下它的方法介绍,它所定义的方法也十分的简单好上手的:

修饰符和返回类型方法和方法说明
Tget()返回当前线程所对应的线程局部变量。
protected TinitialValue() 返回该线程变量的初始值
voidremove() 将当前线程的局部变量删除。
voidset(T value) 设置当前线程局部变量的值。
static <S> ThreadLocal<S>withInitial(Supplier<? extends S> supplier)创建线程局部变量实例,指定初始值。

ThreadLocal 基本原理

我们现在就来探究一下ThreadLocal的基本原理,我们可以把它想象成有一个内部的Map,存放着以Thr线程的唯一标识符作为Key值,然后我们对应的线程的局部变量对应的Value值。

结论

今天我们对ThreadLocal类进行了简单的入门了,希望不了解的开发同学,可以在自己尝试使用一下。

参考文献

精通Spring 4.x
Java SE 8 Doc