我今天早上才知道 ThreadLocal。我读到它应该始终是最终的和静态的,例如:
private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
(Session是一个Hibernate Session)
我的困惑是:因为它是静态的,它对JVM中的任何线程都是可用的。然而,它将保存访问它的每个线程的本地信息?我正在努力解决这个问题,所以如果不清楚,我深表歉意。应用程序中的每个线程都可以访问同一个 ThreadLocal 对象,但是 ThreadLocal 对象将存储每个线程本地的对象?
最佳答案
是的,实例是相同的,但是代码附加了您使用 Thread.currentThread()
设置的值,当您设置和检索时,因此可以访问该值集当使用方法 set
和 get
访问时,就在当前线程中。
它真的很容易理解。
想象一下,每个 Thread
都有一个将值关联到 ThreadLocal
实例的映射。每次在 ThreadLocal
上执行 get 或 set 时,ThreadLocal
的实现都会获取与当前 Thread
关联的映射( Thread.currentThread()
) 并使用自身作为键在该映射中执行 get
或 set
。
示例:
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/