你会使用ThreadLocal吗

本文共 1,131 字,预计阅读时间 4 分钟

什么是ThreadLocal 呢?

ThreadLocal叫做线程变量,是指ThreadLocal中填充的变量属于当前线程,该变量对其他线程而言是隔离的。特点是ThreadLocal为变量在每个线程中都创建了一个副本,每个线程只可访问自己内部的副本变量,不存在多线程数据共享问题。ThreadLocal 变量通常被private static修饰,当一个线程结束时,它所使用的所有 ThreadLocal 相对的实例副本都可被回收。

ThreadLocal 使用场景有哪些?

了解其特性后,那么使用场景就需根据实际需求确定。如每次从前端请求到后端时,验证用户的合法性,若验证通过时将登录用户的信息从缓存中加载到当前线程中,以便当前线程使用登录用户信息。当然有人会问,既然需要从缓存中获取用户信息再加载到当前线程中使用,那么为什么在要使用用户信息的地方直接从缓存中获取呢?这种方式也没错,且来慢慢分析。

以现在出现传输协议HTTP 1.0 和 HTTP 1.1来说,每次请求都是一个新的线程吗?答案是否定的,也就是说每次请求不一定都是一个新的线程,有多个方面的因素,这里不详细说明。

因此,多个请求可能使用的是同一个线程,若每次请求从缓存中获取数据和从ThreadLocal 获取数据,那种方式更佳呢?如果说一个请求就是一个线程,那么每次从缓存中获取,不考虑网络原因,确实没错。但这种情况是不确定的,故从ThreadLocal 获取效率更高,速度更快。

附代码做参考(可根据实际情况修):

复制代码
public class UserCache {
    private static ThreadLocal<User> threadLocal = new ThreadLocal<>();

    public static <T extends User> void put(T t) {
        threadLocal.set(t);
    }

    @SuppressWarnings("unchecked")
    public static <T> T get() {
        if (null == (T) threadLocal.get()) {
            return (T) new User();
        }
        return (T) threadLocal.get();
    }

    public static void remove() {
        threadLocal.remove();
    }
}
复制代码

可直接通过UserCache.put()赋值,UserCache.set()获取。

posted @   钟小嘿  阅读(73)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2021-08-03 Git合并分支
点击右上角即可分享
微信分享提示