我今天早上才知道ThreadLocal的事。我读到它应该始终是最终的和静态的,比如:
private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();(会话是休眠会话)
我的困惑是:因为它是静态的,所以JVM中的任何线程都可以使用它。然而,它会保存访问它的每个线程的本地信息吗?我正在试着理解这一点,所以如果不清楚的话,我很抱歉。应用程序中的每个线程都可以访问相同的ThreadLocal对象,但是ThreadLocal对象将存储每个线程的本地对象吗?
发布于 2012-06-26 01:20:37
是的,实例是相同的,但是代码附加了您在设置和检索时使用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定义了一个值,它将可以从子one访问。
发布于 2012-06-26 01:20:29
对于特定的问题,您总是访问相同的ThreadLocal实例,但是该实例为调用get方法的每个线程返回一个不同的值。
这就是重点:查找对象很容易,但每个线程都有自己的特定值。因此,例如,您可以确保您的特定值不会被两个不同的线程访问。
您可以(从概念上)将其视为一种HashMap<Thread><V>,它将始终以Thread.currentThread()作为键来访问。
发布于 2012-06-26 01:34:52
因为特定于线程的值并不存储在ThreadLocal对象中,而是存储在current Thread的ThreadLocalMap中。ThreadLocal对象只是在这些映射中充当键。
有关详细信息,请阅读ThreadLocal和子类的JavaDoc,或者,如果您对实现很感兴趣,请阅读最近每个JDK src.zip中提供的源代码。
https://stackoverflow.com/questions/11194089
复制相似问题