Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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_Stack - Fatal编程技术网

Java 每个线程还是每个方法调用堆栈?

Java 每个线程还是每个方法调用堆栈?,java,multithreading,stack,Java,Multithreading,Stack,在下面的示例中,创建了多少堆栈 public class Test { public static void main(String [] args){ Test test = new Test(); test.callMe(); } public void callMe(){ System.out.println("Call Me"); callMe2(); } public void callMe2(){ System.out.println("Call Me2"); } } 如果有两个线

在下面的示例中,创建了多少堆栈

public class Test {
public static void main(String [] args){
Test test = new Test();
test.callMe();
}
public void callMe(){
System.out.println("Call Me");
callMe2();
}
public void callMe2(){
System.out.println("Call Me2");
}
}

如果有两个线程同时访问main方法,那么会创建多少堆栈?堆栈不是在方法之间共享的吗?

每个线程都有一个堆栈,每个方法调用都使用该堆栈的一个新区域。这意味着如果一个方法调用自身,它将拥有一组新的局部变量

创建了多少个堆栈?堆栈不是在方法之间共享的吗


只是澄清一下,堆栈是一个实现细节,不是用Java创建的。此外,方法是语言级抽象,而堆栈是运行时的一部分。这个问题的正确答案取决于许多事情,如操作系统、机器体系结构等,JLS中没有介绍。

如果每个方法调用都有一个新的局部变量框架,那么您就不需要堆栈。您可以使用堆内存来完成这一切。实际上,出于性能原因,所有实际实现都将使用堆栈,并且在堆栈和线程之间有一对一的对应关系。

您所说的“两步”在哪里
main
通常是一个进程入口点,在进程入口点,您通常谈论的是一个线程。好的。知道了。但是如果两个线程同时访问callMe()方法呢?这很好,但是如何在没有实现的情况下运行Java程序呢?JLS可能没有提到堆栈,但JVM规范确实谈到了堆栈和堆栈框架,Java类库(请参阅)@Stephen:但是与JVM线程类似,它没有提到“JVM堆栈”以1:1的比例显式映射到运行时堆栈。您提到的堆栈是一个VM抽象,而OP在这里谈论的是传统意义上的线程和堆栈,尽管我可能弄错了。方法调用使用的“堆栈区域”称为“堆栈框架”。