首页 文章

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

提问于
浏览
-2

假设下面的代码:

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

    单线程和多线程应用程序之间的内存分配基本没有区别(至少在.Net / Windows世界中) .

    在堆(普通对象)或堆栈(对于局部变量/本地结构/函数参数)中分配的内存 . C#应用程序(和大多数Windows应用程序)的默认堆栈大小为每个线程1Mb,但堆在所有线程之间共享 .

  • 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/),他已经多次详细讨论过这个问题 .

相关问题