在函数中创建变量 - 多线程环境

时间:2017-10-07 23:51:36

标签: java multithreading

你可以帮我吗?

我在Java中有一个函数'f'。该函数适用于多线程环境

f() {

SomeObject someO = new SomeObject();


  function1(someO);
  .
  .
  .
  function7(someO);

}

问题:第一个线程进入函数'f'并创建SomeObject的新实例然后调用function1,function2等。稍后的第二个线程进入方法并在第一个线程处于function4时创建SomeObject的新instnce。问题是SomeObject的哪个实例将由函数5,6,7中的第一个线程处理?

2 个答案:

答案 0 :(得分:1)

第一个线程将其SomeObject(又名some0)的实例作为局部变量,因此它对于该堆栈帧是本地的,因此对于该线程。它只能引用some0的实例。

调用f()的任何其他线程将创建一个不同的实例,也称为some0,并且只能引用它的副本。

这些是局部变量的规则。如果some0是一个实例变量 - 即在f()之外声明 - 那么如果它们在任何类的同一个实例上调用f(),则该变量可以被不同的线程引用。(/ p) >

这些是规则 - 这是一个更完整的解释。

在堆栈上声明局部变量;这意味着,对于在方法中声明的任何变量,对于该方法的调用,在“堆栈帧”中有引用它们的空间。每次调用方法时,都会为方法中的所有局部变量分配堆栈空间,因此它们的引用与该方法的任何其他调用都是分开的。因此,如果另一个线程调用该方法,它将为局部变量获取不同的堆栈帧。

在递归过程中也会发生同样的事情,即,如果f()要调用自身。对于f()的每次调用,局部变量引用仍然是分开的,即每个递归调用都有它自己的副本。否则,根本不会使用递归。

答案 1 :(得分:0)

First thread will process first instance of SomeObject. Every Thread creates its own stack. and whatever methods it is calling and whatever local objects it is creating, will live in that stack and these objects are not affected by other thread. So in your case thread 1 one processing is not going to affect by thread 2 processing.