ThreadLocal
ThreadLocal
1.什么是ThreadLocal
ThreadLocal(线程本地),用通俗易懂的话来说,就是每个线程中都会存一份变量副本,这个变量相对于当前线程来说是全局的
ThreadLocal<Integer> tl = new ThreadLocal<>();
Thread t1 = new Thread(() -> {
System.out.println(tl.get());
tl.set(0);
System.out.println(tl.get());
});
Thread t2 = new Thread(() -> {
System.out.println(tl.get());
tl.set(1);
System.out.println(tl.get());
});
t1.start();
t1.join();
t2.start();
2.ThreadLocal的特点
ThreadLocal 提供了一种特殊的线程安全方式
使用 ThreadLocal 时,每个线程可以通过 ThreadLocal#get
或 ThreadLocal#set
方法访问资源在当前线程的副本,而不会与其他线程产生资源竞争。这意味着 ThreadLocal 并不考虑如何解决资源竞争,而是为每个线程分配独立的资源副本,从根本上避免发生资源冲突,是一种无锁的线程安全方法
public API | 描述 |
---|---|
set(T) | 设置当前线程的副本 |
T get() | 获取当前线程的副本 |
[void remove](https://www.zhihu.com/search?q=void remove&search_source=Entity&hybrid_search_source=Entity&hybrid_search_extra={"sourceType"%3A"answer"%2C"sourceId"%3A"2883569649"})() | 移除当前线程的副本 |
ThreadLocal |
创建 ThreadLocal 并指定缺省值创建工厂 |
protected API | 描述 |
T initialValue() | 设置缺省值 |
2.1.ThreadLocal 如何实现线程隔离?(重点理解)
ThreadLocal 在每个线程的 Thread 对象实例数据中分配独立的内存区域,当我们访问 ThreadLocal 时,本质上是在访问当前线程的 Thread 对象上的实例数据,不同线程访问的是不同的实例数据,因此实现线程隔离
Thread 对象中这块数据就是一个使用线性探测的 ThreadLocalMap 散列表,ThreadLocal 对象本身就作为散列表的 Key ,而 Value 是资源的副本。当我们访问 ThreadLocal 时,就是先获取当前线程实例数据中的 ThreadLocalMap 散列表,再通过当前 ThreadLocal 作为 Key 去匹配键值对
在jdk8以前的设计中
假如有一个程序,有1个ThreadLocal和3个Thread,那么对于早期设计来说,需要存储3个entry才能实现线程隔离的效果
在jdk8以后的设计中
假如有一个程序,有1个ThreadLocal和3个Thread,那么对于当前设计来说,每个thread需要存储1个entry就能实现线程隔离的效果
一个线程(Thread)可以拥有多个ThreadLocal变量
public static void main(String[] args) {
threadLocal1.set("Hello");
threadLocal2.set(42);
System.out.println("ThreadLocal1 in main: " + threadLocal1.get());
System.out.println("ThreadLocal2 in main: " + threadLocal2.get());
Thread anotherThread = new Thread(() -> {
System.out.println("ThreadLocal1 in another thread: " + threadLocal1.get());
System.out.println("ThreadLocal2 in another thread: " + threadLocal2.get());
});
anotherThread.start();
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!