当多个线程调用相同的函数时,Java / C#如何分配内存

时间:2013-03-15 04:06:25

标签: c# java multithreading

假设以下代码:

Class test
{
   void foo()
   {
      int i=0;
   }
}

Test t=new Test();
// if many threads call t.foo();

每个线程都有自己的内存来调用foo吗?这意味着每个线程都有自己的i

Java / C#在调用函数时如何分配内存? 我记得在C#中,每个线程都会分配1M内存。那Java呢?

2 个答案:

答案 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/)他已经讨论了这个问题。时间更详细。