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

时间:2018-02-17 19:09:00

标签: java multithreading thread-local

我试图理解Java中ThreadLocal概念的概念,我有点困惑。

例如,要定义线程的任务,我们会这样做:

public void run() {

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

所以,如果我们创建了6个帖子,那么每个帖子都有自己的"总和"变量为本地?

如果这不是ThreadLocal的概念,我在理解这个概念时会遗漏一些东西。

任何人都可以帮我理解这个吗?

2 个答案:

答案 0 :(得分:1)

方法中的局部变量始终是线程的本地变量,因为它们存在于堆栈中。但是,实现该线程的类的实例变量存在于堆上并由所有线程共享。

如果每个线程都需要自己的副本,则需要使用ThreadLocal,它只是一个Map<key-class,value-class>,其中键是线程标识符,值是线程本地值本身。

考虑可以由多个线程使用的类的单个实例。注意,我不是指Runnable本身,而是指可以从几个不同线程调用其方法的实例。有一个实例,该类设计为由多个线程并行使用。因此,它需要将每个调用线程的状态与其他线程分开。州。这是ThreadLocal

的用例

答案 1 :(得分:1)

sum不是ThreadLocal变量。

ThreadLocal是一种允许在每个线程的基础上存储值的工具。有关详细信息,请参阅以下问题:

  

When and how should I use a ThreadLocal variable?

请考虑以下代码:

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

然后,当您致电sum.get()时,您将在您在其他主题中调用15sum.set(...)的主题中获得null

ThreadLocal通过维护线程/值的静态映射来实现它。