java - java类方法在单线程和多线程环境下如何分配内存并执行?

标签 java multithreading callstack

我读到了如何执行方法,这就是我的理解: 1)方法在方法区中分配内存,并且只维护一个副本,该副本在类的所有实例中使用。 2) 当从实例调用方法时,当前线程(单线程环境)会加载 main,然后加载通过实例调用的方法,例如:

main(String ags[])
{
   A a = new A();
   a.method();
}
// code of method
 method()
 {
   for(int i=0;i<25;i++)
   system.out.println(i);
 }

因此对于这个线程来说,它有自己的调用堆栈,然后在方法调用时,相同的方法体及其局部变量被推送到主方法上方的同一堆栈上。

现在基于上述理解,我不明白的是,在多线程环境中,如果我运行两个线程,相同的代码将如何表现 并且两者共享同一个实例。例如:

//My run method for myRunnable
run()
{
  a.method();
}

Thread one = new Thread(new myRunnable(a)); // object from above
Thread two= new Thread(new myRunnable(a));

现在,当两个线程开始执行时,它们将拥有自己的调用堆栈。

这种情况下共享对象的方法将如何执行?

谢谢

最佳答案

1) 方法在方法区中分配内存,并且只维护一个副本,该副本在该类的所有实例中使用>>,这意味着方法实现的字节码对于所有实例来说只有一个。并且方法字节码内存区域与对象的堆是分开的。

当然,每个线程都有自己的堆栈,就像您所解释的那样。

关于java - java类方法在单线程和多线程环境下如何分配内存并执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37585484/

相关文章:

ios - 多线程编译问题

javascript - 超出最大调用堆栈大小 - 没有明显的递归

javascript - 相同的功能,不同的时间行为

java - 有没有办法动态更改 JScrollPane 的边框标题?

java - 在这种情况下我应该使用异常吗?

java - 将 DecimalFormat 与 ThreadLocal 结合使用会对性能产生哪些影响?

c++ - __func__ 和日志记录

java - 如何以编程方式将 gis shapefile 导入 postgis 数据库?

java - 使用 java 从图像中读取表单字段以进行 OCR

c++ - 如果 std::thread 对自身调用 joinable 会发生什么?