ThreadLocal 概念:run() 或 call() 中的任何变量都不是本地线程吗? [复制]
Posted
技术标签:
【中文标题】ThreadLocal 概念:run() 或 call() 中的任何变量都不是本地线程吗? [复制]【英文标题】:ThreadLocal Concept: Doesn't any variable within run() or call() a thread local? [duplicate] 【发布时间】:2018-07-28 10:26:11 【问题描述】:我正在尝试理解Java中ThreadLocal
概念的概念,我有点困惑。
例如,要定义线程的任务,我们这样做:
public void run()
int sum = 0;
// Code which a thread executes
那么,如果我们创建了 6 个线程,每个线程不是都有自己的本地“sum”变量吗?
如果这不是ThreadLocal
的概念,我是不是在理解这个概念时遗漏了什么。
谁能帮我理解这个?
【问题讨论】:
sum
在这种情况下是堆栈的一部分 - 而 ThreadLocal
s 则以堆上的对象为目标。
【参考方案1】:
方法中的局部变量对于线程来说总是局部的,因为它们存在于堆栈中。但是,实现线程的类的实例变量存在于堆上并由所有线程共享。
如果每个线程都需要自己的副本,则需要使用ThreadLocal
,它实际上只是一个Map<key-class,value-class>
,其中键是线程标识符,值是线程本地值本身。
考虑一个可以被多个线程使用的类的单个实例。请注意,我不是指Runnable
本身,而是指可以从多个不同线程调用其方法的实例。有一个实例,并且该类被设计为由多个线程并行使用。所以它需要将每个调用线程的状态与其他线程的状态分开。这是ThreadLocal
的用例。
【讨论】:
感谢您的回答,我的印象是,既然“局部变量”对于线程来说是局部的,那么这个概念有什么意义。如果我理解正确,如果我们有一个类级别的实例变量(它有 run()),那么对于每个线程都有它的“自己的”变量,我们使用“ThreadLocal”的概念吗?顺便说一句,这个概念与我们在 C 中作为 POSIX 多线程编程的一部分听到的“线程特定数据”有什么关系吗? 查看我的更新,并阅读标记的重复问题。【参考方案2】:sum
不是 ThreadLocal
变量。
ThreadLocal
是一种允许基于每个线程存储值的工具。详情请查看以下问题:
When and how should I use a ThreadLocal variable?
考虑以下代码:
ThreadLocal<Integer> sum = new ThreadLocal();
sum.set(15);
然后,当您调用sum.get()
时,您将在调用sum.set(...)
的线程中获得15
,在其他线程中获得null
。
ThreadLocal
通过维护线程/值的静态映射来实现。
【讨论】:
以上是关于ThreadLocal 概念:run() 或 call() 中的任何变量都不是本地线程吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
RuntimeError: Cannot run in multiple processes: IOLoop instance has already been initialized. You ca