• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
大心眼幼稚鬼
博客园    首页    新随笔    联系   管理    订阅  订阅

【面试笔记】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(); // 移除当前线程副本
}

posted @ 2025-07-04 17:18  大心眼幼稚鬼  阅读(15)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3