threadlocal线程

本周,我花了一些合理的时间来消除Web应用程序中的所有ThreadLocal变量。 原因是他们造成了类加载器泄漏,我们不能再适当地取消部署我们的应用程序。 取消部署应用程序后,当GC根目录继续引用应用程序对象时,将发生类加载器泄漏。 如果取消部署后仍引用应用程序对象,则无法对整个类加载器进行垃圾回收,因为考虑的对象引用了您的应用程序类文件,而应用程序类文件又引用了类加载器。 取消部署和重新部署几次后,这将导致OutOfMemoryError

ThreadLocal是一种经典的候选人,可以轻松在Web应用程序中创建类加载器泄漏。 服务器正在管理池中的线程。 这些线程的寿命比您的Web应用程序更长。 实际上,它们根本不会消失,直到基础JVM死亡。 现在,如果将ThreadLocal放入引用类的对象的池线程中,则必须*小心。 您需要确保使用ThreadLocal.remove()再次删除此变量。 Web应用程序中的问题是:安全删除ThreadLocal变量的正确位置在哪里? 另外,您可能不想每次同事决定将另一个ThreadLocal添加到托管线程时都修改该“删除代码”。

我们围绕线程局部开发了一个包装器类,该类将所有线程局部变量保留在一个单独的ThreadLocal变量中。 这是代码。

public class ThreadLocalUtil {private final static ThreadLocal<ThreadVariables> THREAD_VARIABLES = new ThreadLocal<ThreadVariables>() {/*** @see java.lang.ThreadLocal#initialValue()*/@Overrideprotected ThreadVariables initialValue() {return new ThreadVariables();}};public static Object getThreadVariable(String name) {return THREAD_VARIABLES.get().get(name);}public static Object getThreadVariable(String name, InitialValue initialValue) {Object o = THREAD_VARIABLES.get().get(name);if (o == null) { THREAD_VARIABLES.get().put(name, initialValue.create());return getThreadVariable(name);} else {return o;}}public static void setThreadVariable(String name, Object value) {THREAD_VARIABLES.get().put(name, value);}public static void destroy() {THREAD_VARIABLES.remove();}
}public class ThreadVariables extends HashMap<String, Object> { }public abstract class InitialValue {public abstract Object create();}

实用程序类的优点是无需开发人员就可以单独管理线程局部变量的生命周期。 该类将所有线程局部变量放在一个变量映射中。 可以在您可以安全地删除Web应用程序中的所有线程本地变量的地方调用destroy()方法。 在我们的例子中,这就是ServletRequestListener -> requestDestroyed()方法。 您还需要将finally块放置在其他位置。 典型的地方是HttpServletinit()doPost()doGet()方法附近。 请求完成或意外引发异常后,这可能会删除池工作线程中的所有线程本地。 有时,服务器的main线程会泄漏线程局部变量。 如果是这种情况,则需要找到正确的位置来调用ThreadLocalUtil -> destroy()方法。 为此,要弄清楚主线程实际上在哪里创建线程变量。 您可以使用调试器来做到这一点。

许多人建议出于多种原因而在Web应用程序中省略ThreadLocal 。 在池化线程环境中删除它们可能非常困难,因此您可以安全地取消部署应用程序。 ThreadLocal变量可能有用,但是在应用它们之前考虑其他技术是很公平的。 Web应用程序可以携带请求范围参数的替代方法是HttpServletRequest 。 许多Web框架允许通用的请求参数访问以及请求/会话属性访问,而无需与本地Servlet / Portlet API绑定。 同样,许多框架支持请求使用依赖项注入将作用域Bean注入到对象树中。 所有这些选项都满足大多数要求,因此在使用ThreadLocal之前应考虑这些选项。

参考:线程故事: JCG合作伙伴 Niklas的Web应用程序中的ThreadLocal。

翻译自: https://www.javacodegeeks.com/2012/05/threading-stories-threadlocal-in-web.html

threadlocal线程

threadlocal线程_线程故事:Web应用程序中的ThreadLocal相关推荐

  1. 线程故事:Web应用程序中的ThreadLocal

    本周,我花了一些合理的时间来消除Web应用程序中的所有ThreadLocal变量. 原因是他们造成了类加载器泄漏,我们不能再适当地取消部署我们的应用程序. 取消部署应用程序后,当GC根目录继续引用应用 ...

  2. java 图片放在哪_在Java Web应用程序中,应该将用户照片存储在哪里?

    小编典典 解决方案前要考虑的事项: 您是否会水平扩展Web应用程序(即,您是否正在运行多个servlet容器实例). 您期望什么样的流量? 图片需要更新的速度(即用户更改了头像后,他们和所有其他用户是 ...

  3. Spring Boot Web应用程序中注册 Servlet 的方法实例

    Spring Boot Web应用程序中注册 Servlet 的方法实例 本文实例工程源代码:https://github.com/KotlinSpringBoot/demo1_add_servlet ...

  4. Web应用程序中(VS2005+SP1)添加App_Code(转)

    Web应用程序中(VS2005+SP1)添加App_Code 在Web应用程序中不能通过右键项目-〉"添加"-〉"添加ASP.NET文件夹"方式添加 .因为We ...

  5. spring_在基于Spring的Web应用程序中使用Http Session

    spring 在基于Spring的Web应用程序中拥有和使用Http会话有多种方法. 这是基于最近项目经验的总结. 方法1 只需在需要的HttpSession中注入即可. @Service publi ...

  6. 如何在Web应用程序中使用TWAIN驱动程序的自定义功能?

    如何在Web应用程序中使用TWAIN驱动程序的自定义功能?接下来跟着小编一起来看看如何去实现. 本文适用于以下产品: Dynamic Web TWAIN v7 以上 ImageCapture Suit ...

  7. DotNetCore Web应用程序中的Session管理

    原文来自互联网,由长沙DotNET技术社区编译.如译文侵犯您的署名权或版权,请联系小编,小编将在24小时内删除.限于译者的能力有限,个别语句翻译略显生硬,还请见谅. 作者简介:Jon(Jonathan ...

  8. DotNetCore Web应用程序中的Cookie管理

    原文来自互联网,由长沙DotNET技术社区编译.如译文侵犯您的署名权或版权,请联系小编,小编将在24小时内删除.限于译者的能力有限,个别语句翻译略显生硬,还请见谅. 作者简介:Jon(Jonathan ...

  9. Spring Security并发会话控制示例教程–如何限制Java JEE Web应用程序中的用户会话数...

    如果您不知道, Spring安全性可能会限制用户可以拥有的会话数. 如果要开发Web应用程序,尤其是Java JEE中的安全Web应用程序 ,则必须提出与在线银行门户相似的要求,例如, 每个用户一次只 ...

最新文章

  1. (二十三)原型模式详解(clone方法源码的简单剖析)
  2. antdesign的input增加自定义校验规则
  3. 【我的项目经验】——Visual Studio 插件
  4. 内存条能4+8混插吗?_笔记本内存条双通道提升有多大?实测FORESEE,你知道好处在哪吗...
  5. 杀掉php所有进程,杀死某个用户的所有进程
  6. 故宫也在拼多多卖货!故宫文具将入驻拼多多开设旗舰店!
  7. Nature 子刊重磅:腾讯与钟南山团队发布新冠危重症 AI 预测模型 Cox
  8. kettle 驱动位置
  9. 国际直拨电话号码格式
  10. DocLocker - 文档外发控制系统
  11. [每日一氵]笔记本电脑充电后卡得一批
  12. oracle导入excel乱码,Oracle导出的文件为什么用Excel打开是乱码?
  13. C++ exception with description “bad optional access“ thrown in the test body.
  14. sklearn聚类之—KMeans
  15. xp计算机管理下的服务显示不出来,WinXP系统任务栏不显示打开窗口的三种解决方案...
  16. 1027: 伊顿公学进入名校人数第2题(2级)输入两个用空格分隔的整数m和n,分别表示某年的毕业生人数和该年度进入某名校的百分比。输出输出一个整数count,表示该年度进入该名校的学生人数
  17. 使用CSS提高网站性能的30种方法
  18. 云呼叫中心系统实现坐席远程办公
  19. css 居中设置和图片白底处理
  20. MAC下连接Windows的远程桌面Microsoft Remote Desktop

热门文章

  1. idea如何安装lombok
  2. 【php】正则无法截取\反斜杠的解决方法
  3. 《走遍中国》珍藏版(三)
  4. sql server链接查询
  5. #{} vs ${}
  6. oracle10g ty_str_split,Oracle split(分隔字符串函数)
  7. datatable中某一列最小值_获取DataTable 某一列所有值
  8. 转-HTTPClient调用https请求,通过基本认证用户名密码(Basic Auth)
  9. 移位操作提高代码的可读性_本地记录或类,以提高流操作的可读性
  10. HttpClient 4 API –获取状态代码-getStatusLine()。getStatusCode()示例