【面试笔记】threadlocal的用途和用法
从来没注意过的小东西!!!!
ThreadLocal 是 Java 中实现线程级数据隔离的核心工具,通过为每个线程创建变量的独立副本,解决多线程共享资源的并发安全问题。
1.线程上下文传递
在跨方法调用链路中传递非业务参数(如用户身份、请求 ID),避免显式参数传递。
示例:框架中将请求信息存入 ThreadLocal,后续链路直接获取,无需修改方法签名。
2.资源独立管理
为每个线程绑定独占资源,避免竞争:
a.数据库连接:MyBatis 的 SqlSession 通过 ThreadLocal 管理,确保线程使用独立的 DB 会话
b.不安全工具类:将非线程安全的第三方对象(如 SimpleDateFormat)绑定到线程
3.事务上下文存储
在手动事务场景中存储事务状态(如连接对象),保障事务隔离性,Spring 的 TransactionSynchronizationManager 基于此实现
4.线程级缓存
缓存线程频繁访问的数据(如解析后的配置),减少重复计算
5.代码示例
// 1. 定义 ThreadLocal 变量
private static final ThreadLocal<User> userHolder = ThreadLocal.withInitial(() -> null);
// 2. 存储数据(通常在拦截器/过滤器)
public void setCurrentUser(User user) {
userHolder.set(user); // 绑定到当前线程
}
// 3. 获取数据(业务逻辑中直接调用)
public User getCurrentUser() {
return userHolder.get();
}
// 4. 必须清理!防止内存泄漏(建议finally块)
public void removeUser() {
userHolder.remove(); // 移除当前线程副本
}