如何清理ThreadLocals

2023-11-27

有人有一个如何做到这一点的例子吗?它们是由垃圾收集器处理的吗?我正在使用 Tomcat 6。


javadoc 是这样说的:

“只要线程处于活动状态并且 ThreadLocal 实例可访问,每个线程就持有对其线程局部变量副本的隐式引用;线程消失后,其所有线程局部实例副本都将受到垃圾回收(除非存在对这些副本的其他引用)。

如果您的应用程序或(如果您正在谈论请求线程)容器使用线程池,则意味着线程不会死亡。如有必要,您需要自己处理线程局部变量。执行此操作的唯一干净方法是调用ThreadLocal.remove() method.

您可能想要清理线程池中线程的线程局部变量有两个原因:

  • 防止内存(或假设的资源)泄漏,或者
  • 以防止信息通过线程局部变量从一个请求意外泄漏到另一个请求。

线程本地内存泄漏通常不应成为有界线程池的主要问题,因为任何线程本地内存最终都可能被覆盖;即当线程被重用时。但是,如果您错误地创建了一个新的ThreadLocal一遍又一遍地实例(而不是使用static变量来保存单例实例),线程本地值不会被覆盖,并且会累积在每个线程的threadlocals地图。这可能会导致严重泄漏。


假设您正在讨论在 Web 应用程序处理 HTTP 请求期间创建/使用的线程局部变量,那么避免线程局部泄漏的一种方法是注册一个ServletRequestListener与你的网络应用程序的ServletContext并实现侦听器的requestDestroyed方法来清理当前线程的线程局部变量。

请注意,在这种情况下,您还需要考虑以下可能性信息从一个请求泄漏到另一个请求。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何清理ThreadLocals 的相关文章

随机推荐

  • JOIN ON 子句中的 T-SQL Case 语句

    我正在尝试在 a 中构建一个 case if 语句JOIN ON clause LEFT JOIN CTSTRC Statuses ON RIGHT Statuses STRID 3 CTE F61 问题是该列 Statuses STRID
  • PHP dirname 返回符号链接路径

    假设我有一个符号链接 one directory to two directory If I echo dirname dirname FILE 它返回 one directory 最好的退货方式是什么 two directory 用法示例
  • 不使用 nightly 时如何忽略基准测试?

    我有一个包含一些基准测试和测试的文件 想针对稳定版 测试版和夜间版进行测试 然而 要么我不使用基准测试 要么稳定 测试版抱怨 使用 stable beta 时有没有办法隐藏所有基准部分 作为示例 以下代码来自book feature tes
  • 如何在 Windows 上从 pygraphviz 运行 neato

    我正在尝试在 python v 2 7 中使用 pygraphviz 和 networkx 来创建网络映射 我在 stackoverflow 上发现了一个看起来非常有用的脚本 import networkx as nx import num
  • GDB TUI - 输出未对齐

    我在ubuntu上使用gdb 7 7 1 GNU gdb Ubuntu 7 7 1 0ubuntu5 14 04 2 7 7 1 我的终端是 Konsole 2 13 2 我遇到的问题是 当我进入 TUI 模式时 在一两个调试器会话之后 会
  • 设置请求持续时间的全局变量

    我可以为单个请求的长度设置某种全局变量 以便页面的所有控件都可以响应它 而不必将其传递给每个控件吗 例如 如果有人点击我的 MasterPage 上的 保存 按钮 我是否可以设置一些内容 以便我的页面上的每个 UserControl 都可以
  • Future.wait() 不能在没有纤程的情况下等待(在 Meteor.method 中等待另一个 future 时)

    In Meteor 我正在编写一个方法 该方法必须检查某个路径的子目录中是否有新文件 我首先想列出其中的子目录Meteor之后我child process exec一个简单的 bash 脚本 列出自上次执行以来添加的文件 我在使目录发现异步
  • 使用 O 表示法在 for 循环中对 LinkedList 调用 get() 的复杂性

    我有一个 uni 实用程序 可以使用 O 表示法确定一小部分代码的复杂性 代码是 for int i 0 i lt list size i System out println list get i 所讨论的列表是一个链接列表 对于我们的实
  • 如何破译 C 中复杂的指针声明?

    所以我想举个例子 int pi pi is a pointer that points to an integer const int cpi cpi is a pointer that points to a constant integ
  • Excel - 如何转换 UTC 日期时间

    我想在Excel中使用这个字符串作为日期时间 2016 04 06T18 05 32 6550717 03 00 怎样才能转换呢 日期 时间中有两件事引起了问题 第一个是T这表示时间的开始 Excel 使用空格 第二个是右侧的所有内容 如果
  • TestNG 中测试的执行顺序

    如何自定义TestNG中测试的执行顺序 例如 public class Test1 Test public void test1 System out println test1 Test public void test2 System
  • 如果“z”中有“x”和“y”:

    我正在用 python 编写一个问答脚本 它获取 raw input 并将其设置为 theQuestion 我试过if var1 and var2 in theQuestion 但它会查找其中一个字符串 而不是同时查找两个字符串 有没有一种
  • 使用 LongListSelector 连续分页

    当我的 LongListSelector 滚动到底部时 我想自动从 Web 服务加载更多数据 就像商店应用程序一样 我的问题是我找不到任何事件来触发加载更多操作 Microsoft 的建议是使用 LongListSelector ItemR
  • 如何在 Ionic 2 中的选择组件内使用图像

    我正在尝试将图像放入SelectIonic 2 中的组件 我已将图像源文件放入www img我的 Ionic 2 项目中的文件夹 然而 使用一个简单的img tag 使用此代码不显示任何图像
  • goto 可以打破嵌套循环吗?

    JavaScript 支持类似于 goto 的语法来打破嵌套循环 总的来说 这不是一个好主意 但它被认为是可以接受的做法 C 不直接支持break labelName语法 但它确实支持臭名昭著的goto 我相信 C 中可以实现等效的功能 i
  • 如何将 tqdm 与多线程结合使用?

    我试图使用 tqdm 报告从三个链接下载每个文件的进度 我想使用多线程从每个链接同时下载 同时更新进度条 但是当我执行脚本时 有多行进度条 似乎线程正在同时更新 tqdm 进度条 我问我应该如何运行多线程来下载文件 同时保持每次下载的进度条
  • Java - 全名正则表达式

    如何验证全名的正则表达式 我只想要字母 没有数字 和正则表达式的空格 这就是我到目前为止所做的 你能帮我修复正则表达式吗 非常感谢 public static boolean isFullname String str boolean is
  • 让 ggvis::export_png() 工作

    Goal 导出一个ggvis图为 PNG 文件 用于包含在 Rmd 文档中 Problem 我对 Node js 基本上一无所知 除了它很棒而且我应该了解更多 我了解到 library ggvis mtcars gt ggvis mpg w
  • 如何实现带有子项的可扩展android导航抽屉?

    如何实现这样的android导航抽屉 TopLevelView1 TopLevelView4 可以选择并且没有子项顶级 evelView 5 可以折叠 我的问题是 如果我的小组结构是这样的 All Stared类别 mp3 txt doc
  • 如何清理ThreadLocals

    有人有一个如何做到这一点的例子吗 它们是由垃圾收集器处理的吗 我正在使用 Tomcat 6 javadoc 是这样说的 只要线程处于活动状态并且 ThreadLocal 实例可访问 每个线程就持有对其线程局部变量副本的隐式引用 线程消失后