java - 类级别、实例级别和本地 ThreadLocals

标签 java multithreading

我了解类级别线程局部变量的意义。与线程相关联,我们需要在该线程的不同实例和类之间共享线程局部变量。所以我们需要让他们达到类(Class)水平。如果我们想在同一类的不同实例之间共享本地线程,我们可以将它们设为私有(private)静态。如果我们想在不同的类之间共享本地线程,我们可以将它们设为public static

Q0.如果上述内容有误,请纠正我

我的疑问是关于实例范围(非静态)线程局部变量和局部(在某些方法内定义)线程局部变量:

Q1.对于实例范围(非静态)线程局部变量是否有任何有效的用例?
Q2.本地(在某些方法中定义)线程局部变量是否有任何有效的用例?
Q3.当实例被垃圾回收时,实例范围(非静态)线程局部变量是否会被删除?
Q4. 当方法返回时,本地(在某个方法内定义)线程局部变量是否被删除?

最佳答案

ThreadLocal当正确实现为静态变量时,它本质上充当所有有权访问它的线程的实例变量。即使有一个 ThreadLocal变量,该机制使每个线程都有自己的值实例。

因此

Q1。不,将实例范围限定为 ThreadLocal 是没有意义的。这并不意味着您不能编写使用范围为 TL 的实例的代码。 ,但是您需要跟踪(在您的开发人员心中)用于正确功能的实例线程,即使您会找到用例代码可以解决这个问题,会有更好的方法来处理它。

第二季度。不会。由于局部变量永远不能有多个线程访问它,因此它与常规局部变量没有什么不同。

第三季度。 ThreadLocal<>包装器变得无法访问,但实际变量仍然包含在线程的映射中,正如您所说的正确。这会导致资源/内存泄漏,因为在线程停止之前无法清除它。

第四季度。与 Q3 相同,如果丢失包装器引用,则会立即泄漏。如果您将引用分配到某个地方,这只是奇怪的编程。本地方法ThreadLocal变量将是非常令人担忧的代码。

无论如何,在现代代码(甚至更旧的代码)中,您都不想过多使用该类,并且它与响应式(Reactive)编程不兼容,但如果您确实使用它,则用法是直接的。单ThreadLocal最容易实现为类级别变量。

关于java - 类级别、实例级别和本地 ThreadLocals,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61043734/

相关文章:

java - EJB3.0 : Using dependency injection as opposed to the session object

java - 为什么 Hibernate 每次请求都创建新的数据库连接?

java - 扩展 RepositoryRestMvcConfiguration 打破了 Jackson LocalDateTime 序列化

c++ - 如何制作轻量级的加载-存储屏障

java - 如何在 Mac 上安装 Java 8

Java 小程序的替代方案和桌面应用程序中的可用性

C++ 析构函数和 PTHREAD_CANCEL_ASYNCHRONOUS

c++ - boost::threads 程序导致大量竞争条件

multithreading - 如何将对堆栈变量的引用传递给线程?

java - 使用Java同时调用多个Web服务