Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果我的程序中有多个线程,那么从技术上讲,每个线程都有它吗';谁拥有自己的堆栈?每个线程都有它吗';他自己的堆?_Java_Multithreading - Fatal编程技术网

Java 如果我的程序中有多个线程,那么从技术上讲,每个线程都有它吗';谁拥有自己的堆栈?每个线程都有它吗';他自己的堆?

Java 如果我的程序中有多个线程,那么从技术上讲,每个线程都有它吗';谁拥有自己的堆栈?每个线程都有它吗';他自己的堆?,java,multithreading,Java,Multithreading,我一直试图在(和Google)中找到这个问题的答案,但我找不到任何直接讨论多线程程序中调用堆栈和堆状态的内容 另外,同步对象是否会在两个堆栈之间翻转(假设它们是独立的堆栈)它们共享堆,但每个线程都有自己的堆栈(否则它将不知道它正在执行什么) 没有什么是不稳定的(我不明白你为什么认为会发生这种情况)。对象不能同步,只同步代码(通过获取对象的监视器或锁)。Java中的多个线程共享同一堆空间。每个线程都有自己的堆栈 Java虚拟机是基于堆栈的。在伪代码中,add指令可能如下所示 push 2 //St

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


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

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


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

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

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

push 2 //Stack: 2
push 3 //Stack: 2,3
add    //Stack: 5
如果线程共享同一个地址空间,那么它可能会变得奇怪,因为它们共享同一个堆栈。当它们开始从其他线程弹出值时,虚拟机将执行奇怪的操作并可能崩溃

下面是如果我们在两个线程上执行上述相同的示例时可能出现的情况(这只是堆栈可能出现的情况)


您可以很容易地看到,如果它们共享同一个堆栈,那么事情很快就会损坏。

自己的堆栈,共享的堆栈。谢谢。请参阅我的同步问题。堆栈维护引用,如果线程1执行同步部分,threa2将保持等待。@Nambari-除非代码明确请求同步,否则不会。即使如此,这也是一个非常复杂的主题。对象只存在于共享堆中。一个同步对象位于堆上并保持在那里。别忘了堆栈只有原语和引用。感谢上帝,先生。我在任何地方都找不到一个直接的答案。另外,我更新了我的问题,请看一看。我会尽快接受。同步是一个复杂的话题。不是几分钟就能理解和欣赏的东西。。。。或者几个小时。。。。或者几天。
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