当说每个线程都有自己的堆栈时,这在概念上意味着什么?


10

我一直在阅读Brian Goetz的《实践中的Java并发性》, 在“ 堆栈限制 ”部分中,提到每个线程都有自己的堆栈,因此本地变量本质上局限于执行线程。它们存在于执行线程堆栈中,其他线程无法访问它们。他是什么意思,每个线程都有其自己的执行堆栈?


4
为了对此有更深入的了解,请查询堆栈指针寄存器及其在汇编中的使用方式。这将解释线程如何轻松拥有自己的堆栈。
彼得·史密斯

1
同意彼得·史密斯。这可能会花费一些时间,但是之后您将对发生的情况,发生的原因和发生的原因有全面的了解
superM 2012年

Answers:


13

您知道由于任何原因中断调试器时,IDE会为您提供堆栈跟踪吗?而且每个方法(堆栈框架)都有自己的局部变量集,您可以在调试器中检查它们?

那就是程序的“执行堆栈”。它显示了程序当前的本地状态。作者在说的是,每个线程都有自己的不同执行栈,就像这样。它有自己的调用堆栈,并且每个方法都有自己的局部变量。

由于变量存储为执行堆栈的一部分,而不是存储在堆中,因此它们对于正在运行的线程是唯一的,不能直接共享。但是,您可以复制它们,或以各种方式将对对象的引用传递给其他线程,因此,这在很大程度上是学术上的区别。


请在第三段中更加强调,以声明暴露于其他线程或长期存在的对象的局部变量将不再受到限制。因此,从OP的书中引用的主张是非常可疑的。
rwong

4
@rwong:不可能以有问题的方式将局部变量公开给另一个线程。变量仅包含基元或引用。对象存在于堆中。
Michael Borgwardt

@MichaelBorgwardt让我们分别考虑两种情况,说变量包含一个原语,即情况A,并说该变量包含一个引用,即情况B。由于基元是通过值传递的,因此局部变量确实是线程安全的,但引用又如何呢?它们可以通过吗?为什么说不可能呢?
极客

2
@Geek:因为变量和它所引用的对象是两个单独的不同的事物,所以在这种详细程度的讨论中不应混淆。局部变量不能公开给其他线程。对象当然可以。
Michael Borgwardt

@MichaelBorgwardt我明白您在说什么。感谢您的澄清。
极客
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.