我了解类级别线程局部变量的意义。与线程相关联,我们需要在该线程的不同实例和类之间共享线程局部变量。所以我们需要让他们达到类(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/