假设以下代码:
Class test
{
void foo()
{
int i=0;
}
}
Test t=new Test();
// if many threads call t.foo();
每个线程都有自己的内存来调用foo吗?这意味着每个线程都有自己的i
?
Java / C#在调用函数时如何分配内存? 我记得在C#中,每个线程都会分配1M内存。那Java呢?
答案 0 :(得分:0)
单线程和多线程应用程序之间的内存分配基本没有区别(至少在.Net / Windows世界中)。
在堆(普通对象)或堆栈(对于局部变量/本地结构/函数参数)中分配的内存。 C#应用程序(和大多数Windows应用程序)的默认堆栈大小为每个线程1Mb,但堆在所有线程之间共享。
答案 1 :(得分:0)
在您为C#描述的场景中会发生什么(不确定Java,但我相信它会表现得相似)是我将将值存储在短期存储中(堆栈或寄存器取决于JIT想要的内容)去做)。这是因为它是一种值类型。如果它是一个引用类型,那么它很可能会在堆上。
每次调用函数时(无论线程如何),函数都将获得变量i的新实例。因此,对于该函数的调用次数,无论哪个线程或多少线程都无关紧要。
有一点需要注意的是,你不能总是保证会分配什么东西,而且大多数情况下你都不应该关心。允许JIT / CLR做任何想做的事情,只要它不影响事件的单线程视图和程序的功能(有边缘情况,但99%的代码这个说法是正确的)。
你也可以阅读Eric Lippert对这个问题的答案(Fields of class, are they stored in the stack or heap?)以便更好地理解他的博客(http://blogs.msdn.com/b/ericlippert/)和(http://ericlippert.com/)他已经讨论了这个问题。时间更详细。