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