我今天早上刚刚了解了ThreadLocal.我读到它应该总是最终的和静态的:
private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
(Session是一个Hibernate会话)
我的困惑是:因为它是静态的,所以JVM中的任何线程都可以使用它.然而,它会保存访问它的每个线程的本地信息吗?我试图绕过这个,所以如果不清楚我会道歉.应用程序中的每个线程都可以访问相同的ThreadLocal对象,但ThreadLocal对象将存储每个线程的本地对象?
解决方法
是的,实例将是相同的,但是当您设置和检索时,代码会附加您使用Thread.currentThread()设置的值,因此当使用方法访问时,可以在当前线程内访问值集设定并得到.
它真的很容易理解.
想象一下,每个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是层次结构的,这意味着如果你为父线程定义了一个值,它将可以从子线程访问.