首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对ThreadLocal感到困惑

对ThreadLocal感到困惑
EN

Stack Overflow用户
提问于 2012-06-26 01:17:54
回答 3查看 1.4K关注 0票数 6

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

代码语言:javascript
复制
private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();

(会话是休眠会话)

我的困惑是:因为它是静态的,所以JVM中的任何线程都可以使用它。然而,它会保存访问它的每个线程的本地信息吗?我正在试着理解这一点,所以如果不清楚的话,我很抱歉。应用程序中的每个线程都可以访问相同的ThreadLocal对象,但是ThreadLocal对象将存储每个线程的本地对象吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-26 01:20:37

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

它真的很容易理解。

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

示例:

代码语言:javascript
复制
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访问。

票数 10
EN

Stack Overflow用户

发布于 2012-06-26 01:20:29

对于特定的问题,您总是访问相同的ThreadLocal实例,但是该实例为调用get方法的每个线程返回一个不同的值。

这就是重点:查找对象很容易,但每个线程都有自己的特定值。因此,例如,您可以确保您的特定值不会被两个不同的线程访问。

您可以(从概念上)将其视为一种HashMap<Thread><V>,它将始终以Thread.currentThread()作为键来访问。

票数 2
EN

Stack Overflow用户

发布于 2012-06-26 01:34:52

因为特定于线程的值并不存储在ThreadLocal对象中,而是存储在current ThreadThreadLocalMap中。ThreadLocal对象只是在这些映射中充当键。

有关详细信息,请阅读ThreadLocal和子类的JavaDoc,或者,如果您对实现很感兴趣,请阅读最近每个JDK src.zip中提供的源代码。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11194089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档