你会使用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()获取。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2021-08-03 Git合并分支