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#getThreadLocal#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 withInitial(Supplier) 创建 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就能实现线程隔离的效果

image-20240117144939299

一个线程(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();
    }
posted @   zhangyf1121  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示