繁体   English   中英

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

[英]How does java class method is allocated memory and executed in single threaded and multithreaded environment?

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

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

因此,对于该线程,它具有自己的调用堆栈,然后在方法调用时,具有本地变量的相同方法主体被推入main方法上方的同一堆栈中。

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

//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)方法在方法区域中分配了内存,并且仅维护一个副本,该副本在类>>的所有实例中使用,这意味着方法实现的字节码在所有实例中仅一个。 并且方法字节码存储区与对象的堆分开。

每个线程都有自己的堆栈,就像您对其进行解释一样。

如果您有多个线程在同一个对象上同时运行相同的方法,则将出现以下情况:

  • 局部变量存储在每个线程的堆栈中。 它们不会共享,不会冲突。

  • 对象实例( this )及其所有字段(例如this.foo )都存储在堆中。 堆是共享的。 为确保其正常工作,您必须适当地应用线程同步机制。

  • static字段也被共享,访问也必须被协调

在您的示例中,循环中的i是局部变量。 两个线程将按顺序打印所有数字(但是两个线程的输出以未定义的顺序交错)。

好,你走进一个房间。

有人递给您一个剪贴板,铅笔和白板笔,然后告诉您开始按照墙上的特定海报上写的说明进行操作。

另一面墙上有一个白板:它看起来像一个电子表格,其中包含行和列,以及在单元格中写入的数字和单词。 剪贴板上有一张纸,上面有更多的行和列,有些数字写在铅笔的某些单元格中。

这些说明逐步告诉您如何执行一些复杂的计算。 他们说,

...
Step 37: Copy the number from B5 on the whiteboard into J2 on your
         clipboard.
Step 38: Add J2 through J7 on your clipboard, and write the result in J9.
Step 39: If the result in J9 is greater than the value in whiteboard-C9,
         then go back to step 22, otherwise, go on to step 40.
Step 40: Erase whiteboard-C9, and then copy the value from clipboard-J9
         into that location.
...

剪贴板上有一个空间,您可以在其中写下自己的笔记。 例如,您可以使用它来跟踪执行的步骤,或者完成工作需要记住的其他内容。

墙上还有其他海报,还有其他人,每个人都有他/她自己的剪贴板。 有些人遵循与您相同的海报的指示,而有些人则从其他海报中阅读。 每个人都在同一白板上阅读/书写。

每个人都按照自己的步调前进。 那些与您阅读同一张海报的人并不一定要与您走同一步,而且由于你们每个人的剪贴板上都有不同的初始编号,因此您甚至可能没有按照相同的顺序执行说明。

这是一个多线程计算的简化模型:墙上的海报是方法,白板是堆,人员是线程,剪贴板是堆栈。

这也与工业时代的科学/工程计算方法大致相似。 从事这种工作的人称为“计算机”。

如果您要协调整个过程,并且是时候添加新的“线程”(即,当新的志愿者走进房间时),那么您需要给该人自己的剪贴板(堆栈),具有自己的初始值(参数),但是您不给新人自己的海报(方法):您只是将他/他指向墙上已经出现的一张海报。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM