ThreadLocal

ThreadLocal 是 Java 提供的一种线程本地存储机制,用于为每个线程提供独立的变量副本,变量的值仅在线程内可见,从而实现线程隔离。这种特性在需要为每个线程维护独立状态的场景中非常有用,例如用户上下文、事务管理等。

hreadLocal 的基本使用
示例代码:
public class ThreadLocalExample {
private static final ThreadLocal<Integer> threadLocal = ThreadLocal.withInitial(() -> 0);

public static void main(String[] args) {
Thread t1 = new Thread(() -> {
threadLocal.set(1);
System.out.println(Thread.currentThread().getName() + " -> " + threadLocal.get());
});

Thread t2 = new Thread(() -> {
threadLocal.set(2);
System.out.println(Thread.currentThread().getName() + " -> " + threadLocal.get());
});

t1.start();
t2.start();
}
}
 
输出:

Thread-0 -> 1
Thread-1 -> 2
 

分析:

  • 每个线程调用 ThreadLocal.set() 方法时,值只在当前线程中生效,互不干扰。
  • ThreadLocal.get() 返回当前线程绑定的值。

ThreadLocal 的核心方法
方法 描述
set(T value) 设置当前线程的本地变量值。
get() 获取当前线程的本地变量值。如果当前线程没有设置过值,则返回 initialValue() 方法的默认值。
remove() 移除当前线程的本地变量值,避免内存泄漏。
withInitial(Supplier<T>) 创建一个 ThreadLocal 并指定初始值。
 

 

synchronized和ThreadLocal的区别,synchronized是一种同步机制,采用以“时间换空间”的方式,只是提供一份数据,让不同的线程排队使用,它的侧重点在于多个线程之间同步访问资源。而ThreadLocal则是以“空间换时间”,为每一个线程都提供了一份数据的副本,从而实现同时访问而互不干扰,它侧重于多线程中让每个线程之间的数据的相互隔离。
 

Thread维护一个ThreadLocalMap哈希表,这个Hash表的Key是ThreadLocal本身,value是要存储的数据Object具体的过程如下:

1.每个Thread都有一个Map,名为ThreadLocalMap
2.ThreadLocalMap里面存储了ThreadLocal对象(Key)和线程的数据副本(Value)
3.Thread内部的ThreadLocalMap是由ThreadLocal维护的,由ThreadLocal负责向map获取和设置线程的数据
4.对于不同的线程,每次获取副本数据时,别的线程并不能获取当前线程的副本数据,实现了副本数据的隔离。

 ThreadLocalMap 是ThreadLocal的内部类,没有实现Map接口,而是使用独立的方式实现了Map的功能,其内部的Entry也是独立实现的。并且继承自弱引用的接口


 

posted @   KLAPT  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
历史上的今天:
2021-03-06 Web 网站进化
2021-03-06 TensorFlow
点击右上角即可分享
微信分享提示