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.
的静态映射来实现
我正在尝试理解 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.