问题标签 [thread-local]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Servlet 中的 SimpleDateFormat
我在我的 Servlet 中使用了很多 SimpleDateFormat 对象。不幸的是,SimpleDateFormat 不是线程安全的。因此,我考虑用 ThreadLocal 包装它以促进 SimpleDateFormat 对象的重用。我写了一个 util-class 来启用它:
实际上,这似乎会导致内存泄漏。关闭我的 webapp 时,Tomcat 会记录以下错误消息:
严重:Web 应用程序 [] 创建了一个 ThreadLocal,其键类型为 [null](值 [com.example.util.DateUtil$2@50242f7d]),值类型为 [java.text.SimpleDateFormat](值 [java.text .SimpleDateFormat@d91b489b]) 但在 Web 应用程序停止时未能将其删除。这很可能造成内存泄漏。
我了解内存泄漏的原因,但是在 Servlet 中处理 SimpleDateFormat 对象(或任何其他非线程安全对象)的最佳方法是什么?
java - 使用 ThreadLocal 作为数据的上下文是个好主意吗?
使用 ThreadLocal 作为 Web 应用程序中数据的上下文是个好主意吗?
java - ThreadLocal 是否在 TLAB 中分配?
我想,ThreadLocal 变量是在 Thread Local allocation Buffer(s) 或 TLAB 中分配的,对吗?
我没有成功找到任何说明是什么使某些类存储在 TLAB 中的文档。如果您知道一些,请发布链接。
java - ThreadLocals 和并行类加载的影响
假设
如果 A 仅在 vm 上的一个类加载器中加载,则 t1 的值是显而易见的。但是如果 A 在两个不同的类加载器中并排加载,t1 会发生什么?是否会为给定线程共享该值?
java - Servlet 3 规范和 ThreadLocal
据我所知,Servlet 3 规范引入了异步处理特性。除此之外,这意味着同一个线程可以并且将被重用于处理另一个并发的 HTTP 请求。这不是革命性的,至少对于以前与 NIO 合作过的人来说。
无论如何,这导致了另一个重要的事情:没有ThreadLocal
变量作为请求数据的临时存储。因为如果同一线程突然成为不同 HTTP 请求的载体线程,请求本地数据将暴露给另一个请求。
所有这些都是我基于阅读文章的纯粹推测,我没有时间玩任何 Servlet 3 实现(Tomcat 7、GlassFish 3.0.X 等)。
所以,问题:
- 我是否正确地假设这
ThreadLocal
将不再是保留请求数据的方便黑客? - 有没有人玩过任何 Servlet 3 实现并尝试使用
ThreadLocal
s 来证明上述内容? - 除了在 HTTP Session 中存储数据之外,您还有其他类似的易于访问的 hack 建议吗?
编辑:不要误会我的意思。我完全理解危险并ThreadLocal
成为黑客。事实上,我总是建议不要在类似的情况下使用它。然而,不管你信不信,线程上下文的使用频率远远超出你的想象。一个很好的例子是 Spring OpenSessionInViewFilter
,根据它的 Javadoc:
此过滤器使 Hibernate Sessions 通过当前线程可用,事务管理器将自动检测到该线程。
这并不严格ThreadLocal
(尚未检查来源),但听起来已经令人震惊。我可以想到更多类似的场景,而丰富的 Web 框架使这更有可能发生。
简而言之,无论有没有意识,许多人都在这个黑客之上建造了他们的沙堡。因此斯蒂芬的回答是可以理解的,但并不完全是我所追求的。我想确认是否有人真正尝试过并且能够重现失败的行为,因此这个问题可以用作其他被同样问题困住的人的参考点。
scala - 我们什么时候应该使用 scala.util.DynamicVariable?
当我阅读 scalatra 的源代码时,我发现有一些代码如下:
有一个有趣的类名为DynamicVariable
. 我看过这个类的文档,但我不知道什么时候以及为什么我们应该使用它?它有一个withValue()
通常被使用的。
如果我们不使用它,那么我们应该使用什么代码来解决它解决的问题?
(我是scala的新手,如果你能提供一些代码,那就太好了)
java - java threadlocal单例 - 它是什么?
通俗地说,当有人说对象是 Java 中的线程本地单例时,这是什么意思?我参加了一个关于 Java Server Faces 的讲座,每次谈到 FacesContext 时——讲师总是提醒我们它是一个线程本地单例。
grails - 响应写入后如何清理线程局部变量?
我有一个使用 ThreadLocal 的 Grails 应用程序。
目前 ThreadLocal 填充和清除由过滤器处理(之前:填充,之后:清除)。
问题是过滤器的后调用是在模板渲染之前运行的,所以我需要的变量过早地都是空值。是否有一些简单的方法可以在响应完全写入后触发 ThreadLocals 的清除?
一种方法是在填充 ThreadLocal 之前清除它,从而将所有工作留给过滤器的before -call。但我不喜欢让 ThreadLocal “携带” vars 的想法,因为它们不再用于任何事情,所以需要其他东西。
regex - Pex 检测可以导致代码改变其效果吗?
我有一个简单的 JSON 词法分析器类;它需要 astring
并生成一个IJSONValue
; 有IJSONValue
一个ToJSONString
返回有效 JSON 字符串的方法。
当然,它的代码非常复杂,有很多分支。这就是为什么我认为这将是测试 Pex 能力的理想场所。我创建了以下测试:
在此运行 Pex,我发现了一些与 null 处理无关的问题,我已经修复了这些问题。但是,我也有很多方法报告没有意义的异常。它们看起来像这样:
然而,这与我知道有效的测试之一非常相似。我在调试器中和调试器外部运行它,在这两种情况下测试都通过了。最令人难以置信的是,异常文本实际上是有道理的;Constant
如果正则表达式与字符串不匹配,则会报告该文本"false"
。对于其他正则表达式不匹配,我得到了类似的例外,这是没有意义的。
为什么 Pex 认为这会引发异常?仪器是否混乱ThreadLocal
或Regex
以一种奇怪的方式?这就是我的正则表达式持有类的样子(为简洁起见,对正则表达式进行了编辑)。
java - ThreadLocal 在 servlet 中存储 ServletRequest 和 Response:有什么用?
一旦我遇到了一种模式,将 whereServletRequest
和 response 对象放入 servlet 的局部ThreadLocal
变量。servlet 类也有获取当前请求和响应对象的方法。所以为了得到这些对象,你仍然需要使用 servlet 对象进行操作。
拥有这些ThrealLocal
局部变量有什么意义?