我一直试图在API(以及Google)中找到这个问题的答案,但我无法找到任何直接讨论多线程调用堆栈和堆的状态的内容程序
此外,同步对象是否在两个堆栈之间翻转(假设它们是单独的堆栈)
答案 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
你可以很容易地看到,如果他们共享相同的堆栈,那么事情就会快速腐败。