为什么应该避免在 servlet 中使用 InheritableThreadLocal?

2023-12-27

我在用InheritableThreadLocal in my Servlet班级。这样它就可以从它的子线程中使用。这是邪恶的使用吗InheritableThreadLocal在线程池执行器中? 。比如servlet线程池。

我的问题。

1)为什么我们应该避免使用InheritableThreadLocals在 servlet 中?

2)内存泄漏是否可能发生在InheritableThreadLocal?

3)有没有什么替代方案InheritableThreadLocal?.

4)如果线程将被重用会发生什么,存储在threadlocal不会被清除吗?

我的实时场景

public class UserAccessFilter implements javax.servlet.Filter {

      static final InheritableThreadLocal<String> currentRequestURI = new InheritableThreadLocal<String>();

      public void  doFilter(ServletRequest req, ServletResponse resp , FilterChain fc) throws IOException, ServletException{
              String uri = request.getRequestURI();
              fc.doFilter(request, response);         
      }
}


public class MailServlet extends HttpServlet{

      @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    String mailCount = req.getParameter("mailCount");

    if(mailCount != null && !"".equals(mailCount) && mailCount.matches("[0-9]+")){
        MailThread mailThread = new MailThread("[email protected] /cdn-cgi/l/email-protection", generateToAddress(Integer.parseInt(mailCount))); //NO I18N
        Thread t = new Thread(mailThread);
        t.start();
    }

    resp.getWriter().println("Mail Servlet.............."); //NO I18N

}              

}

class MailThread implements Runnable{

private String from;
private String to;

public MailThread(String from , String to){
    this.from = from;
    this.to = to;
}


@Override
public void run() {
    sendMail();
}

    public void sendMail(){
        //I want this uri from child threads. I can't pass this value to this constructor.
        String uri = currentRequestURI.get();
        //Do Mail Operations
    }


}

过滤器 --> Servlet A --> 子线程 ---> 邮件线程(这里我获取过滤器中设置的值)。


为什么我们应该避免在 servlet 中使用 InheritableThreadLocals?

它们代表了潜在的泄漏路径信息从一个请求到另一个请求。 “问题”是请求是由线程池处理的。当一个请求完成时,线程处理的下一个请求可能是针对不同的用户的。但是,如果您忘记在完成第一个请求时清除线程本地状态,则它有可能被第二个请求使用。

InheritableThreadLocal 中可能存在内存泄漏吗?

是的……有点。如果我们假设工作池是有界的,则任何线程的线程本地状态都可能被覆盖,从而清除内存泄漏。最坏的情况是,问题是有限的内存泄漏……受池中线程数量的限制。

信息泄露问题更令人担忧。

InheritableThreadLocal 有其他选择吗?

在请求或响应对象中设置属性会更好。

如果线程将被重用,会发生什么情况,threadlocal中存储的值不会被清除。

不会被清除的。那就是问题所在!

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

为什么应该避免在 servlet 中使用 InheritableThreadLocal? 的相关文章

  • 获取文件的锁

    我想在对特定文件开始 threo read 时获取文件上的锁定 以便其他应用程序无法读取已锁定的文件并希望在线程终止时释放锁定文件 您可以获得一个FileLock https docs oracle com javase 8 docs ap
  • 带有 Android 支持库 v7 的 Maven Android 插件

    我使用 maven android plugin 构建我的 android 应用程序 它依赖于 android 支持库 v4 和 v7 由于我没有找到如何从developer android com下载整个sdk 因此我无法使用maven
  • Base36 编码字符串?

    我一直在网上查找 但找不到解决此问题的方法 在 Python Ruby 或 Java 中 如何对以下字符串进行 Base 36 编码 nOrG9Eh0uyeilM8Nnu5pTywj3935kW 5 Ruby 以 36 为基数 s unpa
  • (Java) App Engine 中的静态文件无法访问

    The 示例文档 http code google com appengine docs java gettingstarted staticfiles html表示您只需将文件放在 war 或子目录 中 并且应该可以从主机访问它们 只要它
  • HAProxy SSL终止+客户端证书验证+curl/java客户端

    我希望使用我自己的自签名证书在 HAProxy 上进行 SSL 终止 并使用我创建的客户端证书验证客户端访问 我通过以下方式创建服务器 也是 CA 证书 openssl genrsa out ca key 1024 openssl req
  • Reactive Spring 不支持 HttpServletRequest 作为 REST 端点中的参数?

    我创建了一个 RestController 如下所示 RestController public class GreetingController RequestMapping value greetings method RequestM
  • 埃拉托色尼筛法 - 实现返回一些非质数值?

    我用 Java 实现了埃拉托斯特尼筛法 通过伪代码 public static void sieveofEratosthenes int n boolean numArray numArray new boolean n for int i
  • 在 Struts 2 中传递 URL 参数而不使用查询字符串

    我想使用类似的 URL host ActionName 123 abc 而不是像这样传递查询字符串 host ActionName parm1 123 parm2 abc 我怎样才能在 Struts 2 中做到这一点 我按照下面的方法做了
  • tomcat 7.0.50 java websocket 实现给出 404 错误

    我正在尝试使用 Java Websocket API 1 0 JSR 356 中指定的带注释端点在 tomcat 7 0 50 上实现 websocket 以下是我如何对其进行编码的简要步骤 1 使用 ServerEndpoint注解编写w
  • 如何在java Spring Boot中实现通用服务类?

    我有许多具有重复代码的服务 我想知道如何实现通用服务 以便我的所有服务都可以扩展它 服务接口示例 重复代码 Service public interface IUserService List
  • 如何检测图像是否像素化

    之前有人在 SO 上提出过这样的问题 在Python中检测像素化图像 https stackoverflow com questions 12942365 detecting a pixelated image in python还有关于q
  • Java中的断点和逐步调试?

    抱歉我的问题名称很奇怪 我不知道如何寻找这个 因为我不知道这些东西是如何称呼的 Visual Studio 中至少有一个功能 您可以单击代码左侧并设置一个大红点的起点 然后运行程序 您可以通过按 f8 或 f5 实际上是不同的 f 来跟踪步
  • 是否可以从 servlet 内部以编程方式设置请求上下文路径?

    这是一个特殊情况 我陷入了处理 企业 网络应用程序的困境 企业应用程序正在调用request getContext 并将其与另一个字符串进行比较 我发现我可以使用 getServletContext getContextPath 获取 se
  • Spring Data JPA:查询如何返回非实体对象或对象列表?

    我在我的项目中使用 Spring Data JPA 我正在演奏数百万张唱片 我有一个要求 我必须获取各种表的数据并构建一个对象 然后将其绘制在 UI 上 现在如何实现我的 Spring 数据存储库 我读到它可以通过命名本机查询来实现 如果指
  • 我们如何测试包私有类?

    我正在看书Effective Java in Item 13 Minimize the accessibility of classes and members 它提到 为了方便测试 您可能想让类 接口或成员更易于访问 这在某种程度上是好的
  • Play.application() 的替代方案是什么

    我是 Play 框架的新手 我想读取conf文件夹中的一个文件 所以我用了Play application classloader getResources Data json nextElement getFile 但我知道 play P
  • 使用Java绘制维恩图

    我正在尝试根据给定的布尔方程绘制维恩图 例如 a AND b AND c我想在 Android 手机上执行此操作 因此我需要找到一种使用 Java 来执行此操作的方法 我找到了一个完美的小部件 它可以完成我在这方面寻找的一切布尔代数计算器
  • 我可以限制分布式应用程序发出的请求吗?

    我的应用程序发出 Web 服务请求 提供商处理的请求有最大速率 因此我需要限制它们 当应用程序在单个服务器上运行时 我曾经在应用程序级别执行此操作 一个对象跟踪到目前为止已发出的请求数量 并在当前请求超出允许的最大负载时等待 现在 我们正在
  • 源值 1.5 的错误已过时,将在未来版本中删除

    我使用 scala maven plugin 来编译包含 scala 和 java 代码的项目 我已经将源和目标设置为1 7 但不知道为什么maven仍然使用1 5 这是我在 pom xml 中的插件
  • Java 的 PriorityQueue 与最小堆有何不同?

    他们为什么命名PriorityQueue如果你不能插入优先级 它看起来与堆非常相似 有什么区别吗 如果没有区别那为什么叫它PriorityQueue而不是堆 默认的PriorityQueue是用Min Heap实现的 即栈顶元素是堆中最小的

随机推荐

  • 获取特定 div 的 span 类内的文本

    我正在 T Mobile 网站上查找有关三星 Galaxy S9 的评论 我能够为 HTML 代码创建一个 Beautiful Soup 对象 但我无法获取 span 类中存在的评论文本 还需要遍历评论页面以收集所有评论 我尝试了 2 个代
  • jquery 调用 highcharts 生成错误 17

    我试图从 highcharts com 获取一个仪表 在我已经完成示例的页面上工作 但我看不出我做错了什么 如果有人能指出正确的方向 这是我的小提琴 高图仪表不工作 http jsfiddle net F6XUT 这是我的代码
  • Oracle:结合使用 ROWNUM 和 ORDER BY 子句更新表列

    我想用连续的整数填充表列 所以我考虑使用 ROWNUM 但是 我需要根据其他列的顺序填充它 例如ORDER BY column1 column2 不幸的是 这是不可能的 因为 Oracle 不接受以下声明 UPDATE table a SE
  • 使用高分辨率纹理优化 SceneKit 性能

    我是一位相当有经验的 iOS 开发人员 但完全是 SceneKit 新手 试图在基本应用程序中模拟一些行星 为此 我使用火星 金星等的高分辨率法线和漫反射贴图 应用于基本球体 他们工作了 它们看起来棒极了 正是我想要的 问题是 我得到了ki
  • Jquery 模式对话框禁用滚动条

    正如您在此链接中看到的 http jsbin com ozapol 9 http jsbin com ozapol 9 Jquery 在某些版本的 IE 和最新版本的 Chrome 上禁用滚动条 我还没尝试过其他的 有没有办法保持滚动条启用
  • 正则表达式中的命名捕获组

    我需要正则表达式的帮助来捕获以下字符串中的数字和连字符 一些文字和东西 200 1234EM 一些其他东西 它也可以不带连字符的部分出现 一些文本 123EM 其他文本 我需要在命名捕获组中使用 200 1234 或 123 我试过这个 b
  • 嵌入双引号的 CSV 解析

    我写了一个简单的 CSV 文件解析器 但看完之后有关 CSV 格式的 wiki 页面 http en wikipedia org wiki Comma separated values我注意到基本格式的一些 扩展 通过双引号专门嵌入逗号 我
  • 如何让 ActionController::Live Streaming 与 Thin 一起工作?

    Question 你能用吗thin with ActionController Live实现服务器端事件 SSE 和长轮询 如果是这样 怎么办 Context 虽然标题是重复的如何让 Rails 4 ActionController Liv
  • Python 2.6.6 中的小数和科学计数法问题

    我在处理十进制值时遇到困难 在某些情况下需要将其用于算术 而在其他情况下则需要将其用作字符串 具体来说 我有一份费率清单 例如 rates 0 1 0 000001 0 0000001 我使用它们来指定图像的压缩率 我最初需要将这些值作为数
  • 编辑数据时如何获取选定值 [codeigniter]

    当我编辑数据时 如何获取选定的值 但我仍然可以选择 codeigniter div class form group div
  • 当 DataFrame 列中的值以字符串开头时,使用 lambda 替换它们

    我有一个数据框 import pandas as pd import numpy as np x Value Test XXX123 XXX456 Test df pd DataFrame x 我想使用 lambda 将以 XXX 开头的值
  • mysqli::real_connect(): (HY000/2002): 连接被拒绝

    我使用 PHP Mysql 和 Codeigniter 版本 3 创建一个网站 然后将其托管在 iPage 上 当我实时上传时 我会更改配置文件 db default array dsn gt hostname gt 66 96 147 1
  • AndroidAnnotations如何在onCreate之后添加init代码

    如果我有一个活动定义为 EActivity R layout activity login public class LoginActivity extends Activity 这将为我创建 onCreate 方法 但我想在 onCrea
  • 从字符串中按 ID 提取元素?

    我有一个包含以下文本的字符串 p Apples and oranges p div ul li 196 pfel li li Birnen li ul div p Men and women p 现在我需要一个 JavaScript 函数来
  • 使用streamreader逐个字符读取并输出文本文件

    我想做的是读取文件 a txt 并在一行中输出每个字符我真的很难解决这个问题 任何帮助将不胜感激 如果您编写代码 请发表评论 以便我可以理解更清楚 因为我是初学者 谢谢 namespace ConsoleApplication13 clas
  • 获取模块的所有功能

    一个项目具有以下结构 modulename init py one function 1 py function2 py init py two another function py yet another function py ini
  • 使用垂直分割打开新的 Emacs 缓冲区

    如何在 Emacs 中将垂直分割设置为默认而不是水平分割 My use case I want to compare a Python file with an older revision of itself from the svn r
  • 在 docker buildkit 中使用秘密标志的正确方法

    我正在努力解决加文提到的同样问题这个问题 https stackoverflow com questions 56865849 setting docker env var from build secret 特别是在新docker构建秘密
  • 尝试获取准确的信息(CTE - 递归)

    我有不同的桌子和goal是获取每个客户的批准工作流程 以这种方式显示该信息 gt 客户 批准者1 批准者2 批准者3 批准者4 首先 我有一个名为实体的表 12 Math Andrew 308 CHAIN1 MathAndrew 13 Jo
  • 为什么应该避免在 servlet 中使用 InheritableThreadLocal?

    我在用InheritableThreadLocal in my Servlet班级 这样它就可以从它的子线程中使用 这是邪恶的使用吗InheritableThreadLocal在线程池执行器中 比如servlet线程池 我的问题 1 为什么