浅谈 ThreadLocal

本文介绍了ThreadLocal的作用,它是线程级别的变量,用于解决并发场景下的数据隔离问题。文章详细讲解了如何使用ThreadLocal存储和获取数据,并给出了一个ThreadLocal工具类的示例。
摘要由CSDN通过智能技术生成

什么是ThreadLocal 

        ThreadLocal是一个线程级别变量,每个线程都有一个 ThreadLocal 就是每个线程都拥有了自己独立的一个变量,竞态条件被彻底消除了,在并发模式下是绝对安全的变量。

        可以通过 ThreadLocal<T> value = new ThreadLocal<T>()来使用。

        会自动在每一个线程上创建一个 泛型实例,实例之间彼此独立,互不影响,可以用 ThreadLocal 存储一些参数,以便在线程中多个方法中使用,用以代替方法传参的做法。

ThreadLocal 使用场景

        现在假设有两个用户同时访问你的资源,通常情况下会将两个用户的信息存进 redis 方便后续获取,一般不再从数据库进行调用,因为高并发的情况下数据库不能承担大量的请求。但是由于redis里面会存每一个用户的信息,在取信息的时候并不知道是谁的,就会导致取错的情况。

        于是引入ThreadLocal ,它将每个用户的信息在请求该资源时便存进ThreadLocal ,由于ThreadLocal 的独立性,每个用户都有自己的ThreadLocal 变量,下次需要信息就可以直接从ThreadLocal 中获取。

ThreadLocal使用实例

private static ThreadLocal<Map<String, Object>> TL 
= ThreadLocal.withInitial(HashMap::new);

 

        如上述代码所示,ThreadLocal 通常作为工具类使用,通过 ThreadLocal 的 withInitial() 方法,我们可以指定一个初始值的提供者。在这里,初始值提供者是一个 lambda 表达式,它创建并返回一个新的 HashMap 对象。因此,每个线程在访问 TL 变量时,都会获得一个独立的 HashMap实例。

public static void set(String key, Object value) {
        Map<String, Object> map = TL.get();
        map.put(key, value);
    }

     首先,通过调用 TL.get() 方法获取当前线程的 ThreadLocal 变量的值,该值是一个 Map<String, Object> 对象。TL 是之前定义的ThreadLocal变量。然后,通过获取到的 Map 对象,使用 put() 方法将指定的键值对存储到 Map 中。传入的参数 key 是键的名称,value 是要存储的值。 这段代码的作用是将键值对存储到当前线程的 ThreadLocal 变量中。由于 ThreadLocal 提供了线程局部变量的功能,每个线程都有自己独立的存储空间,因此存储在 ThreadLocal 中的数据对其他线程是不可见的,从而实现了线程之间的数据隔离。

整个工具类如下:

public class ThreadLocalUtil {

    private static ThreadLocal<Map<String, Object>> TL = ThreadLocal.withInitial(HashMap::new);

    public static void set(String key, Object value) {
        Map<String, Object> map = TL.get();
        map.put(key, value);
    }

    public static Object get(String key) {
        Map<String, Object> map = TL.get();
        return map.get(key);
    }

    public static void remove(String key) {
        Map<String, Object> map = TL.get();
        map.remove(key);
    }

    public static void clear() {
        TL.remove();
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值