我试图理解Java中ThreadLocal
概念的概念,我有点困惑。
例如,要定义线程的任务,我们会这样做:
public void run() {
int sum = 0;
// Code which a thread executes
}
所以,如果我们创建了6个帖子,那么每个帖子都有自己的"总和"变量为本地?
如果这不是ThreadLocal
的概念,我在理解这个概念时会遗漏一些东西。
任何人都可以帮我理解这个吗?
答案 0 :(得分:1)
方法中的局部变量始终是线程的本地变量,因为它们存在于堆栈中。但是,实现该线程的类的实例变量存在于堆上并由所有线程共享。
如果每个线程都需要自己的副本,则需要使用ThreadLocal
,它只是一个Map<key-class,value-class>
,其中键是线程标识符,值是线程本地值本身。
考虑可以由多个线程使用的类的单个实例。注意,我不是指Runnable
本身,而是指可以从几个不同线程调用其方法的实例。有一个实例,该类设计为由多个线程并行使用。因此,它需要将每个调用线程的状态与其他线程分开。州。这是ThreadLocal
。
答案 1 :(得分:1)
sum
不是ThreadLocal
变量。
ThreadLocal
是一种允许在每个线程的基础上存储值的工具。有关详细信息,请参阅以下问题:
请考虑以下代码:
ThreadLocal<Integer> sum = new ThreadLocal();
sum.set(15);
然后,当您致电sum.get()
时,您将在您在其他主题中调用15
和sum.set(...)
的主题中获得null
。
ThreadLocal
通过维护线程/值的静态映射来实现它。