ThreadLocal是什么、有什么、能做什么?

 

ThreadLocal提供一个线程(Thread)局部变量,访问到某个变量的每一个线程都拥有自己的局部变量。说白了,ThreadLocal就是想在多线程环境下去保证成员变量的安全。

ThreadLocal提供的方法

对于ThreadLocal而言,常用的方法,就是get/set/initialValue方法。

我们直接看相应的源码:

 

来看下最常用的set操作:

    public void set(T value) {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
    }

 

    ThreadLocalMap getMap(Thread t) {
        return t.threadLocals;
    }
    void createMap(Thread t, T firstValue) {
        t.threadLocals = new ThreadLocalMap(this, firstValue);
    }

你会看到,set需要首先获得当前线程对象Thread;

然后取出当前线程对象的成员变量ThreadLocalMap;

如果ThreadLocalMap存在,那么进行KEY/VALUE设置,KEY就是ThreadLocal;

如果ThreadLocalMap没有,那么创建一个;

说白了,当前线程中存在一个Map变量,KEY是ThreadLocal,VALUE是你设置的值。

ThreadLocal是Java中的一个类,它提供了一种线程本地变量的机制。每个线程都有自己独立的ThreadLocal变量副本,可以独立地操作和修改,而不会影响其他线程的副本。 ThreadLocal的使用场景有以下两种: 1. 场景一:用于避免线程安全问题。当多个线程共享同一个对象时,如果这个对象是可变的,就有可能出现竞态条件或并发访问问题。通过将共享对象存储在ThreadLocal中,每个线程都可以独立地操作自己的副本,避免了竞争和并发访问问题。这种情况下,可以使用ThreadLocal来存储线程特定的变量,从而解决线程安全问题。 2. 场景二:用于保存线程特定的上下文信息。有些情况下,某些对象的生成时机不由我们控制,比如在拦截器中生成的用户信息。我们可以使用ThreadLocal.set()方法将这些对象存储到ThreadLocal中,在后续的操作中可以直接从ThreadLocal中获取这些线程特定的上下文信息。这样可以避免在各个方法之间来回传递相同的参数,使得代码更加简洁和优雅。 总结来说,ThreadLocal提供了一种在多线程环境下存储线程本地变量的机制,并且可以解决线程安全问题和保存线程特定的上下文信息的需求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [ThreadLocal原理、作用、内存泄漏及使用场景](https://blog.csdn.net/weixin_46665411/article/details/127157468)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值