ThreadLocal 概念:运行() 或 call() 中的任何变量不是本地线程吗?

ThreadLocal Concept: Doesn't any variable within run() or call() a thread local?

我正在尝试理解 Java 中的 ThreadLocal 概念,但我有点困惑。

比如我们定义线程的任务是这样的:

public void run() {

  int sum = 0;
  // Code which a thread executes
}

那么,如果我们创建 6 个线程,每个线程不会有自己的 "sum" 本地变量吗?

如果这不是ThreadLocal的概念,我是不是在理解这个概念时遗漏了什么。

谁能帮我理解一下?

方法中的局部变量对于线程来说总是局部的,因为它们存在于堆栈中。但是,实现线程的 class 的实例变量存在于堆上并由所有线程共享。

如果每个线程都需要自己的副本,您需要使用 ThreadLocal,这在幕后只是一个 Map<key-class,value-class>,其中键是线程标识符,值是 [=20= 】 价值本身。

考虑可由多个线程使用的 class 的单个实例。请注意,我指的不是 Runnable 本身,而是指可以从多个不同线程调用其方法的实例。有一个实例,class 设计为供多个线程并行使用。所以它需要保持每个调用线程的状态与其他线程的状态分开。这是 ThreadLocal.

的用例

sum 不是 ThreadLocal 变量。

ThreadLocal 是一种允许在 per-thread 基础上存储值的工具。请参阅以下问题了解更多详情:

When and how should I use a ThreadLocal variable?

考虑以下代码:

ThreadLocal<Integer> sum = new ThreadLocal();
sum.set(15);

然后,当您调用 sum.get() 时,您将在您调用 sum.set(...) 的线程中获得 15 并在其他线程中获得 null

ThreadLocal通过维护thread/value.

的静态映射来实现