ThreadLocal 适用于变量在线程间隔离,而在方法或类间共享的场景。如果用户信息的获取比较昂贵(比如从数据库查询用户信息),那么在 ThreadLocal 中缓存数据是比较合适的做法。但有时候会出现用户信息错乱的 Bug 。
因为线程的创建比较昂贵,所以 Web 服务器往往会使用线程池来处理请求,这就意味着线程会被重用。这时,使用类似 ThreadLocal 工具来存放一些数据时,需要特别注意在代码运行完后,显式地去清空设置的数据。如果在代码中使用了自定义的线程池,也同样会遇到这个问题。
比如:
@GetMapping(“right”)
public Map right(@RequestParam(“userId”) Integer userId) {
String before = Thread.currentThread().getName() + “:” + currentUser.get();
currentUser.set(userId);
try {
String after = Thread.currentThread().getName() + “:” + currentUser.get();
Map result = new HashMap();
result.put(“before”, before);
result.put(“after”, after);
return result;
} finally {
//在finally代码块中删除ThreadLocal中的数据,确保数据不串
currentUser.remove();
}
}
ThreadLocal的坑
最新推荐文章于 2024-08-21 15:52:21 发布
本文探讨了ThreadLocal在Web服务器线程池环境中的使用,指出当线程被重用时,如果不正确清理ThreadLocal数据,可能会导致用户信息错乱的问题。示例代码展示了如何在finally块中清除ThreadLocal中的数据,以防止数据残留导致的错误。
摘要由CSDN通过智能技术生成