java - 对 ThreadLocal 感到困惑

标签 java thread-local

我今天早上才知道 ThreadLocal。我读到它应该始终是最终的和静态的,例如:

private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();

(Session是一个Hibernate Session)

我的困惑是:因为它是静态的,它对JVM中的任何线程都是可用的。然而,它将保存访问它的每个线程的本地信息?我正在努力解决这个问题,所以如果不清楚,我深表歉意。应用程序中的每个线程都可以访问同一个 ThreadLocal 对象,但是 ThreadLocal 对象将存储每个线程本地的对象?

最佳答案

是的,实例是相同的,但是代码附加了您使用 Thread.currentThread() 设置的值,当您设置和检索时,因此可以访问该值集当使用方法 setget 访问时,就在当前线程中。

它真的很容易理解。

想象一下,每个 Thread 都有一个将值关联到 ThreadLocal 实例的映射。每次在 ThreadLocal 上执行 get 或 set 时,ThreadLocal 的实现都会获取与当前 Thread 关联的映射( Thread.currentThread()) 并使用自身作为键在该映射中执行 getset

示例:

ThreadLocal tl = new ThreadLocal();
tl.set(new Object()); // in this moment the implementation will do something similar to Thread.getCurrentThread().threadLocals.put(tl, [object you gave]) 

Object obj = t1.get(); // in this moment the implementation will do something similar to Thread.getCurrentThread().threadLocals.get(tl)

有趣的是 ThreadLocal 是分层的,这意味着如果您为父 Thread 定义了一个值,子线程就可以访问它。

关于java - 对 ThreadLocal 感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11194089/

相关文章:

JavaFX 绘制形状时出现鼠标输入问题?

java - DispatcherServlet 中的 ThreadLocal

java - 线程本地实现

c++ - thread_local 变量何时以及如何初始化和销毁​​?

C++线程本地计数器实现

java - ThreadLocal initialValue() 每个线程调用多次。为什么?

java - 继续收到此错误 : "variable total might not have been initialized"

java - 如何修复 "Exception in thread "main“java.lang.NullPointerException”

java - jaxb 枚举到字符串自定义映射

java - 如何使用 Try/Catch (Selenium WD + Java) 在日志中打印有错误的行号?