首页 > 其他分享 >2024.9.26 ThreadLocal

2024.9.26 ThreadLocal

时间:2024-09-26 20:25:05浏览次数:9  
标签:26 2024.9 tl remove ThreadLocal 线程 static public

在使用 ThreadLocal 的情况下,并发量很高时不会产生冲突,原因如下:

1. 线程隔离

  • ThreadLocal 为每个线程提供独立的存储空间。每个线程都可以安全地设置和获取其自己的变量值,而不会影响其他线程。即使在高并发环境下,线程间的数据是隔离的。

2. 并发安全

  • ThreadLocal 本身是线程安全的。由于每个线程都有自己的副本,所以即使多个线程同时操作 ThreadLocal 变量,也不会造成数据竞争或冲突。

3. 线程池的使用

  • 在使用线程池时,线程会被复用。为了避免旧数据的泄漏,必须确保在请求处理结束时调用 remove() 方法清除 ThreadLocal 中的值。这能有效避免在不同请求之间共享数据。

注意事项

尽管 ThreadLocal 在并发环境中提供了安全性,但仍需关注以下几个方面:

  1. 内存泄漏

    • 如果不调用 remove() 清理 ThreadLocal 变量,线程在池中复用时可能会持有旧值,导致内存泄漏。
  2. 性能

    • 高并发情况下,ThreadLocal 的使用不会显著影响性能,但在设计上仍需确保它是合适的选择,避免不必要的复杂性。
  3. 资源管理

    • 确保 ThreadLocal 的生命周期与请求的生命周期一致,避免因错误的使用造成资源占用。
public class UserContext {
    private static final ThreadLocal<Long> tl = new ThreadLocal<>();

    /**
     * 保存当前登录用户信息到ThreadLocal
     * @param userId 用户id
     */
    public static void setUser(Long userId) {
        tl.set(userId);
    }

    /**
     * 获取当前登录用户信息
     * @return 用户id
     */
    public static Long getUser() {
        return tl.get();
    }

    /**
     * 移除当前登录用户信息
     */
    public static void removeUser(){
        tl.remove();
    }
}
-------
public class ThreadLocalUtil {
    //提供ThreadLocal对象,
    private static final ThreadLocal THREAD_LOCAL = new ThreadLocal();

    //根据键获取值
    public static <T> T get() {
        return (T) THREAD_LOCAL.get();
    }

    //存储键值对
    public static void set(Object value) {
        THREAD_LOCAL.set(value);
    }


    //清除ThreadLocal 防止内存泄漏
    public static void remove() {
        THREAD_LOCAL.remove();
    }


}

标签:26,2024.9,tl,remove,ThreadLocal,线程,static,public
From: https://www.cnblogs.com/258-333/p/18434258

相关文章

  • 9.26每日总结
    给出SpringbootCloud的server:port:8084spring:application:name:user-serviceprofiles:active:devdatasource:url:jdbc:mysql://${hm.db.host}:3306/hm-user?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=......
  • 2024.9.26 计划
    项目下午读论文,用gpt搞懂怎么实时生成热力图,以及如何叠加信号学习上午ROS学习下午-晚上DP总结ROS学习-进程通信(接昨天)遇到了问题:Invoking"makecmake_check_build_system"failed解决方式:功能包里不能有重复名称的节点,检查工作区中是否有其他CMakeLists.txt文......
  • 20240926测试
    a题面:有一个\(n\timesm\)的\(01\)矩阵,求其中\(1\)的个数在\([l,r]\)的子矩阵数量题解:令\(f_k\)为\(1\)的个数\(\lek\)的子矩阵数量,答案为\(f_r-f_{l-1}\)。\(n\)较小,暴力枚举上下区间,在内用双指针维护和小于等于\(k\)的段,复杂度\(\text{O}(n^2m)\)。......
  • STM32F103C8T6+ESP8266+MQTT+EMQX完成数据上传和点灯环节
    本文参考以下文章:【最简单】STM32+ESP8266+MQTT+EMQX完成数据上传和点灯环节_stm32如何连接emqx-CSDN博客STM32+ESP8266通过MQTT协议连接本地EMQX(保姆级教学!资料开放!)_stm32驱动esp8266本地emqx-CSDN博客 一、在windows环境下或Ubuntu搭建EMQX云平台 参看这篇文章:搭建自己的M......
  • 9.26总结
    省流:死了T1由乃的差分分情况讨论。x<0最简单的情况,只需要升序输出即可。x=0其实就是:零不能放最前面,连续两个不一样,先把第一个输出完然后用排序pair加上双指针乱搞即可。x>0这里给一组hack23770037707hack掉两个同学的输入QWQ先输出第一个,......
  • 一个基于Transformer模型的中文问答系统926.1
    这个代码实现了一个基于Transformer模型的中文问答系统。以下是代码的主要功能和可能的完善方向:主要功能数据处理:代码首先定义了处理中文文本的函数,包括分词、构建词汇表、将句子转换为张量等。数据加载:从.jsonl或.json文件中加载问题和答案数据,并进行数据增强。模型定......
  • SPSS26统计分析笔记——7 回归分析
    1回归方程        回归方程一般表达式:y=f(x......
  • 2024年9月26日历史上的今天大事件早读
     1620年9月26日大明皇帝朱常洛驾崩1815年9月26日俄、普、奥三国在巴黎发表缔结“神圣同盟”1841年9月26日清代思想家、诗人龚自珍逝世1849年9月26日“生理学之父”巴甫洛夫诞生1909年9月26日云南陆军讲武堂创办1953年9月26日画家徐悲鸿逝世1980年9月26日国际宇......
  • 9.26递归函数
    递归函数的定义和格式递归是一种常用的解决问题的方法,特别适用于解决可以被分解为类似子问题//递归函数:在函数内部再次调用自己//解决可以被分解为类似子问题的问题//组成://1.基本情况最小问题的答案//2.递归情况调用自己去解决子问题objectTestFucRecursive{//......
  • 2024.9.25 Python,单词替换,优美的排列 II,sort的用法前K个高频单词,广度优先搜索腐烂的橘
    1.单词替换在英语中,我们有一个叫做词根(root)的概念,可以词根后面添加其他一些词组成另一个较长的单词——我们称这个词为衍生词(derivative)。例如,词根help,跟随着继承词“ful”,可以形成新的单词“helpful”。现在,给定一个由许多词根组成的词典dictionary和......