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 在这种情况下是堆栈的一部分 - 而 ThreadLocals 则以堆上的对象为目标。 【参考方案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() 中的任何变量都不是本地线程吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

并发编程:ThreadLocal

用ThreadLocal类实现线程安全的正确姿势

RuntimeError: Cannot run in multiple processes: IOLoop instance has already been initialized. You ca

Java中的线程本地变量ThreadLocal

Java中的线程本地变量ThreadLocal

多线程-volatile关键字和ThreadLocal详解