如果我的程序中有多个线程,那么每个线程在技术上是否拥有它自己的堆栈?每个线程都有自己的堆吗?

时间:2014-08-07 21:05:00

标签: java multithreading

我一直试图在API(以及Google)中找到这个问题的答案,但我无法找到任何直接讨论多线程调用堆栈和堆的状态的内容程序

此外,同步对象是否在两个堆栈之间翻转(假设它们是单独的堆栈)

2 个答案:

答案 0 :(得分:2)

他们共享堆,但每个线程都有自己的堆栈(否则它不会知道它在执行什么)。

没有什么是翻转的(我不明白为什么你认为会发生这种情况)。对象无法同步,只有代码被同步(通过获取对象的监视器或锁定)。

答案 1 :(得分:0)

Java中的多个线程共享相同的堆空间。每个线程都有自己的堆栈。

Java虚拟机基于堆栈。在伪代码中,添加指令可能如下所示。

push 2 //Stack: 2
push 3 //Stack: 2,3
add    //Stack: 5

如果线程共享相同的地址空间,那么它可能变成奇怪的东西,因为它们共享相同的堆栈。当他们开始从其他线程弹出值时,虚拟机会做一些奇怪的事情并可能崩溃。

如果我们在两个线程上执行相同的示例,这可能是什么样子。(这只是堆栈可能的样子。)

Thread 1               Thread 2
push 2 //Stack: 2    : push 2 //Stack: 2,2
push 3 //Stack: 2,2,3: push 3 //Stack: 2,2,3,3
add //Stack 2,2,6    : add //Stack 2,8

你可以很容易地看到,如果他们共享相同的堆栈,那么事情就会快速腐败。