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

24 浏览
0 Comments

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

这个问题已经有答案了:

何时以及如何使用ThreadLocal变量?

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

例如,为了定义线程任务,我们可以这样做:

public void run() {
  int sum = 0;
  // Code which a thread executes
}

那么,如果我们创建了6个线程,每个线程都将拥有自己的本地“sum”变量,对吗?

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

有人能帮我理解吗?

admin 更改状态以发布 2023年5月24日
0
0 Comments

sum不是ThreadLocal变量。

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

何时以及如何使用 ThreadLocal 变量?

考虑以下代码:

ThreadLocal sum = new ThreadLocal();
sum.set(15);

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

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

0
0 Comments

方法内的局部变量总是局限于线程,因为它们存在于栈上。然而,实现线程的类的实例变量存在于堆上,并被所有线程共享。

如果每个线程需要拥有自己的副本,您需要使用ThreadLocal,它在底层只是一个Map,其中键是线程标识符,值是线程本地值本身。

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

0